%3F.png)
Gibt es eine Möglichkeit, open()
eine Datei zu verkleinern? Man kann sie natürlich im Anfügemodus öffnen oder bis zum Ende suchen und schreiben, um sie zu vergrößern. Soweit ich weiß, gibt es jedoch keine Methode, eine Datei über typische Systemaufrufschnittstellen im Unix-Stil zu verkleinern.
Die einzige Möglichkeit, dies zu tun, besteht meines Wissens darin, es vorzutäuschen, indem man eine neue, kürzere Datei erstellt und rename()
diese an die Stelle der alten setzt.
Ich wollte nur eine Bestätigung, weil ich eine Antwort gesehen habe, die implizierte, dass es möglich sei, Dateieditoren zu erstellen, die direkt mit einer Datei arbeiten, anstatt eine neue Datei zu erstellen und sie an Ort und Stelle umzubenennen.
Ich habe immer gedacht, dass die Datei-API in libc- und unixartigen Systemaufrufschnittstellen keine Verkleinerung von Dateien ermöglicht, um die Implementierung von Dateisystemen zu vereinfachen und möglicherweise Nutzungsmuster zu vermeiden, die zur Fragmentierung beitragen könnten.
Antwort1
DESCRIPTION
The truncate() and ftruncate() functions cause the regular file
named by path or referenced by fd to be truncated to a size of precisely
length bytes.
...
CONFORMING TO
POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).
Weiter heißt es, dass Sie die Datei zum Schreiben geöffnet haben müssen, wenn Sie ftruncate verwenden, und dass die Datei beschreibbar sein muss, wenn Sie truncate verwenden.
Antwort2
Deropen(2)
Der Systemaufruf akzeptiert das O_TRUNC
Flag, mit dem die Dateigröße reduziert werden kann:
O_TRUNC
– Wenn die Datei existiert und eine normale Datei ist und die Datei erfolgreich geöffnet wurdeO_RDWR
oderO_WRONLY
, wird ihre Länge auf 0 gekürzt und der Modus und der Besitzer bleiben unverändert. Dies hat keine Auswirkungen auf FIFO-Spezialdateien oder Terminalgerätedateien. Die Auswirkungen auf andere Dateitypen sind implementierungsdefiniert. Das Ergebnis der VerwendungO_TRUNC
ohneO_RDWR
oderO_WRONLY
ist undefiniert.
Es wird häufig verwendet, wenn das Programm den Inhalt einer Datei vollständig überschreiben möchte. Ein Beispiel ist der Dateiumleitungsoperator Ihrer Shell wie in command > file
.