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.
open()
und Sie haben openat()
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 ist command > file.txt
, dass Dateien abgeschnitten werden, wenn sie vorhanden sind. Wenn Sie laufen strace
auf bash -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ürlich truncate()
syscall. Lassen Sie mich wissen, ob Sie dies als tatsächliche Antwort anstelle des Kommentars wünschen.
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?