
有沒有辦法open()
使文件縮小?當然,我們可以以附加模式打開它們,或者查找到末尾並寫入以使它們增長。然而,據我所知,沒有辦法透過典型的unix風格的系統呼叫介面來收縮檔案。
據我所知,這樣做的唯一方法是透過建立一個新的較短檔案並rename()
取代舊檔案來偽造它。
我只是想確認,因為我看到一個答案暗示可以製作直接在文件上工作的文件編輯器,而不是經歷製作新文件並在適當位置重命名的過程。
我一直認為 libc 和 unix 風格的系統呼叫介面中的檔案 api 不允許縮小檔案以簡化檔案系統的實現,並且可能避免可能導致碎片的使用模式。
答案1
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).
它接著說,如果您使用 ftruncate,您必須打開文件進行寫入,如果您使用 truncate,則文件必須是可寫入的。
答案2
這open(2)
系統呼叫接受O_TRUNC
可以減小檔案大小的標誌:
O_TRUNC
– 如果文件存在且是普通文件,且文件成功開啟O_RDWR
或O_WRONLY
,則其長度將被截斷為0,模式和擁有者不變。它對 FIFO 特殊檔案或終端設備檔案沒有影響。它對其他文件類型的影響是實現定義的。O_TRUNC
不使用O_RDWR
or的結果O_WRONLY
是未定義的。
當程式旨在完全覆蓋文件內容時,經常使用它。一個例子是 shell 的檔案重定向運算符,如 中所示command > file
。