Apakah ada cara untuk open()
file dan menyebabkannya menyusut? Seseorang dapat, tentu saja, membukanya dalam mode-append atau mencari sampai akhir dan menulis untuk menyebabkan mereka tumbuh. Namun, sejauh yang saya tahu, tidak ada metode untuk mengecilkan file melalui antarmuka panggilan sistem khas-unix.
Satu-satunya cara untuk melakukannya, sejauh yang saya tahu, adalah dengan memalsukannya dengan membuat file baru yang lebih pendek dan rename()
menggantikan yang lebih lama.
Saya hanya ingin konfirmasi, karena saya melihat jawaban yang menyiratkan bahwa mungkin membuat editor file yang bekerja secara langsung pada file alih-alih melalui proses pembuatan yang baru dan mengganti nama di tempat.
Saya selalu berpikir bahwa file api di libc dan antarmuka sistem panggilan unix-style tidak memungkinkan penyusutan file untuk memudahkan implementasi sistem file dan mungkin menghindari pola penggunaan yang mungkin berkontribusi terhadap fragmentasi.
open()
dan openat()
sudah memiliki flag untuk memotong, O_TRUNC
jadi secara teknis itu menyebabkan file menyusut - yaitu menyusut sepenuhnya - tanpa mengubah inode. Contoh paling terkenal dari itu adalah command > file.txt
, di mana file akan terpotong jika ada. Jika Anda menjalankan strace
pada bash -c 'true > /dev/null'
Anda akan melihat openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)
di output. Tentu saja untuk ukuran pemotongan yang bervariasi, Anda perlu truncate()
syscall. Beri tahu saya jika Anda menginginkan ini sebagai jawaban aktual dan bukan komentar.
fopen
mode "w" (atau "w +") akan memotongnya menjadi nol panjang secara otomatis. Atau maksud Anda menyusut ke ukuran non-nol, untuk mempertahankan beberapa konten lama?