Gibt es eine Möglichkeit, open()
eine Datei zu verkleinern? Man kann sie natürlich im Append-Modus öffnen oder bis zum Ende suchen und schreiben, damit sie wachsen. Soweit ich weiß, gibt es jedoch keine Methode, um eine Datei über typische Systemaufrufschnittstellen im Unix-Stil zu verkleinern.
Soweit ich weiß, besteht die einzige Möglichkeit darin, sie zu fälschen, indem eine neue kürzere Datei erstellt wird und rename()
diese anstelle der älteren.
Ich wollte nur eine Bestätigung, weil ich eine Antwort sah, die implizierte, dass es möglich war, Datei-Editoren zu erstellen, die direkt an einer Datei arbeiteten, anstatt eine neue zu erstellen und sie umzubenennen.
Ich habe immer gedacht, dass die Datei-API in libc- und Unix-ähnlichen Systemaufrufschnittstellen das Verkleinern von Dateien nicht zulässt, um die Implementierung von Dateisystemen zu vereinfachen und möglicherweise Verwendungsmuster zu vermeiden, die zur Fragmentierung beitragen könnten.
quelle
fopen
im Modus "w" (oder "w +") öffnen, wird sie automatisch auf die Länge Null gekürzt. Oder wollen Sie auf eine Größe ungleich Null schrumpfen, um einen Teil des alten Inhalts zu erhalten?open()
und Sie habenopenat()
bereits ein Flag zum Abschneiden.O_TRUNC
Technisch gesehen führt dies dazu, dass die Datei verkleinert wird, dh vollständig verkleinert wird, ohne den Inode zu ändern. Das bekannteste Beispiel dafür istcommand > file.txt
, dass Dateien abgeschnitten werden, wenn sie vorhanden sind. Wenn Sie laufenstrace
aufbash -c 'true > /dev/null'
Sie werden sehen ,openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
in der Ausgabe. Für eine variable Größe der Kürzung benötigen Sie natürlichtruncate()
syscall. Lassen Sie mich wissen, ob Sie dies als tatsächliche Antwort anstelle des Kommentars wünschen.Antworten:
man -s 2 ftruncate
sagt...
Wenn Sie ftruncate verwenden, müssen Sie die Datei zum Schreiben geöffnet haben, und wenn Sie truncate verwenden, muss die Datei beschreibbar sein.
quelle
truncate
die neue Dateigröße berücksichtigt und dannwrite
diese. Sotruncate
ist der Systemaufruf, den Sie suchen.fallocate(FALLOC_FL_COLLAPSE_RANGE)
Der
open(2)
Systemaufruf akzeptiert dasO_TRUNC
Flag, das die Dateigröße reduzieren kann:Es wird häufig verwendet, wenn das Programm den Inhalt einer Datei vollständig überschreiben soll. Ein Beispiel ist der Dateiumleitungsoperator Ihrer Shell wie in
command > file
.quelle