staging.inyokaproject.org

Wie unterschiedliche Dateisysteme erkennen (C/C++)

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 18.04 (Bionic Beaver)
Antworten |

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Wie kann ich erkennen, ob Dateien auf unterschiedlichen Dateisystemen liegen?

Bisher dachte ich, dass es ausreicht bei stat() das Feld st_dev zu vergleichen. Aber das scheint tatsächlich das physikalische Gerät zu sein. Jedenfalls bekomme ich bei 2 Partitionen auf dem selben Gerät den gleiche Wert (z.B. 0x802).

Bei USB-Sticks oder anderen externen Geräten hat das bisher immer funktioniert.

Ich benötige diese Information, um zu entscheiden, ob ich zum Verschieben von Dateien die Systemfunktion rename() verwenden kann, oder nicht.

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Muss es in C sein? So geht es in der Bash

df -T /path |awk 'END {print $1}'

Oder wenn man stat mit -f aufruft, bekommt man ja Dateisystem-Infos. Das muss sich ja auf die Partition beziehen.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Muss es in C sein?

Ja, also eigentlich muss es eine Systemfunktion sein, damit ich es in ein C++ Programm einbauen kann. Aber es macht eigentlich keinen Unterschied.

manfred@samurai:~$ df -T /home/melchior/ | awk 'END {print $1}'
/dev/sda2
manfred@samurai:~$ df -T /home/dakuan/ | awk 'END {print $1}'
/dev/sda2
manfred@samurai:~$ df -T /home/manfred/ | awk 'END {print $1}'
/dev/sda2

Das war es also nicht.

Da habe ich wohl aus Unwissenheit die Frage falsch formuliert, oder das eigentliche Problem noch nicht erkannt.

Wieso bekomme ich als User:manfred beim Versuch eine Datei von /home/melchior/... nach /home/manfred/test/ zu verschieben einen Fehler? Wenn das das selbe Gerät ist habe ich doch Schreibrecht auf den Ziel.

Kann es sein, dass ich den Fehler falsch interpretiert habe?

Also da stat() sagt, das es sich um das selbe Gerät handelt, hatte ich zum Verschieben die Systemfuktion rename() verwendet, die aber einen Fehler meldet.

Bei unterschiedlichen Geräten muss ich die Bytes tatsächlich kopieren, was dann auch passiert. Allerdings bekomme ich danach die Fehlermeldung, dass die Quelldatei nicht gelöscht werden konnte.

Insgesamt finde ich das ganze ziemlich verwirrend. Ich kann z.B. ohne Probleme eine schreibgeschützte Datei überschreiben, wenn ich im betreffenden Verzeichnis Schreibrecht habe. Als Programmierer kann ich das gerade noch verstehen, aber wie soll ich das dem Benutzer erklären?

Grübel

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Ich denke, dein Problem liegt da, dass Du zwar Schreibrechte auf dem Ziel hast, aber evtl. keine Rechte, an der Quelle die Datei zu löschen.

Das kommt halt drauf an, wie die Rechte gesetzt sind und mit welchem Benutzer Du das Programm ausführst.

Also wenn Du als manfred die Datei verschieben möchtest, musst Du ja im Home von melchior das Recht habe, die Datei zu löschen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Doc_Symbiosis schrieb:

Oder wenn man stat mit -f aufruft, bekommt man ja Dateisystem-Infos. Das muss sich ja auf die Partition beziehen.

Das geht am einfachsten so

1
stat -c %m /path

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Ich war wohl gestern zu lange in der Sonne.

Das kommt halt drauf an, wie die Rechte gesetzt sind ...

Ja, das war die Ursache. Ich hatte zwar Schreibrecht, aber nur im darüber liegenden Verzeichnis.

Das Rechtesystem von Unix/Linux sorgt immer wieder für Überraschungen, z.B. wenn man feststellt, das man problemlos schreibgeschützte Dateien löschen kann, wenn man im betreffenden Verzeichnis Schreibrecht hat.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Dakuan schrieb:

Das Rechtesystem von Unix/Linux sorgt immer wieder für Überraschungen, z.B. wenn man feststellt, das man problemlos schreibgeschützte Dateien löschen kann, wenn man im betreffenden Verzeichnis Schreibrecht hat.

Wieso? "Datei löschen" ist ja in Wirklichkeit "aus dem Verzeichnis entfernen". Der Schreibschutz der Datei bezieht sich auf den Inhalt, der Schreibschutz eines Verzeichnisses bezieht sich auch auf dessen Inhalt - und das ist die Liste der Einträge. Ich finde das unter Linux deutlich logischer und klarer als bei Windows, insbesondere, weil es unter Windows Vererbung von Brechtigungen in Verzeichnisbäumen gibt und man die natürlich auch wieder überschreiben kann.

Dakuan

(Themenstarter)
Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6532

Ja, das ist logisch und konsequent. Aber nicht jeder Benutzer kennt die Unterschiede.

Aktuell muss ich mir jetzt überlegen, wie mein Programm das handhaben soll. Momentan öffne ich die Zieldatei beim Kopieren/Verschieben so:

1
2
3
    dst_file.open( dest, std::ios::binary | std::ios::trunc );
    if( !dst_file ) {
        ...

Das gibt bei einer schreibgeschützten Zieldatei einen Fehler. Wenn ich aber die Datei vorher lösche, läuft das glatt durch. Der Benutzer wurde natürlich gefragt.

Antworten |