So prüfen Sie, ob zwei Dateinamen auf dieselbe physische Datei verweisen

8

Ich habe ein Programm, das zwei Dateinamen als Argumente akzeptiert: Es liest die erste Datei, um die zweite Datei zu erstellen. Wie kann ich sicherstellen, dass das Programm die erste Datei nicht überschreibt?

Einschränkungen:

  • Die Methode muss weiter funktionieren, wenn das Dateisystem (weiche oder harte) Links unterstützt
  • Dateiberechtigungen sind festgelegt und es ist nur erforderlich, dass die erste Datei lesbar ist und die zweite Datei schreibbar ist
  • Es sollte vorzugsweise plattformneutral sein (obwohl Linux das primäre Ziel ist)
Gio 11.01.2010, 13:31
quelle

5 Antworten

12

Öffnen Sie unter Linux beide Dateien, und verwenden Sie fstat , um zu überprüfen, ob st_ino (edit :) und st_dev identisch sind. open folgt symbolischen Links. Verwenden Sie nicht stat direkt, um Rennbedingungen zu vermeiden.

    
Tobu 11.01.2010, 13:39
quelle
9

Am besten verwenden Sie keine Dateinamen als Identitäten. Wenn Sie die Datei zum Lesen öffnen, sperren Sie sie stattdessen mit dem von Ihrem Betriebssystem unterstützten Mechanismus. Wenn Sie dann die Datei zum Schreiben öffnen, sperren Sie sie auch - wenn die Sperre fehlschlägt, melden Sie einen Fehler.

    
anon 11.01.2010 13:36
quelle
3

Wenn möglich, öffnen Sie die erste Datei schreibgeschützt ( O_RDONLY ) in LINUX. Wenn Sie dann versuchen, es erneut zu öffnen, um darauf zu schreiben, erhalten Sie einen Fehler.

    
tvanfosson 11.01.2010 13:34
quelle
0

Sie können stat verwenden, um den Dateistatus abzurufen und zu überprüfen, ob die Inode-Nummern identisch sind.

    
reko_t 11.01.2010 13:41
quelle
-1

Vielleicht könnten Sie die Funktion system () verwenden, um einige Shell-Befehle aufzurufen?

In bash würden Sie einfach anrufen:

%Vor%

Dies zeigt die Inode-Nummer einer Datei an. Sie können zwei Dateien auf diese Weise vergleichen und wenn ihre Inodes identisch sind, bedeutet dies, dass sie harte Links sind. Der folgende Anruf:

%Vor%

zeigt den Namen der Datei an, und wenn es sich um einen symbolischen Link handelt, wird auch der Dateiname gedruckt, mit dem der Link verknüpft ist. Es gibt nur einen Namen aus, auch wenn die Datei, auf die es verweist, feste Links hat. Um den symbolischen Link zu überprüfen, müssten die Inode-Nummern für die zweite Datei und die Datei, zu der die symbolischen Links gehören, verglichen werden.

Sie könnten die stat-Ausgabe in eine Textdatei umleiten und dann die Datei in Ihrem Programm analysieren.

    
mingos 11.01.2010 14:01
quelle

Tags und Links