Jawabannya sedikit tergantung pada apa file.txt
itu, dan bagaimana proses menulisnya!
Saya akan mengutip kasus penggunaan umum: Anda memiliki logfile yang sedang tumbuh dipanggil file.txt
, dan ingin memutarnya.
Karena itu Anda menyalin, misalnya, file.txt
ke dalam file.txt.save
, lalu memotong file.txt
.
Dalam skenario ini, JIKA file tidak dibuka oleh another_process
(mis: another_process
bisa berupa program keluaran ke file itu, misalnya program mencatat sesuatu), maka 2 proposal Anda setara, dan keduanya berfungsi dengan baik (tetapi yang kedua lebih disukai sebagai pertama "cat / dev / null> file.txt" adalah Penggunaan Cat yang Tidak Berguna dan juga terbuka dan membaca / dev / null).
Tetapi masalah sebenarnya adalah jika other_process
masih aktif, dan masih memiliki pegangan terbuka ke file.txt.
Kemudian, 2 kasus utama muncul, tergantung pada seberapa other process
membuka file:
Jika other_process
membukanya dengan cara normal, maka pegangan akan tetap menunjuk ke lokasi sebelumnya dalam file, misalnya pada offset 1200 byte. Oleh karena itu, penulisan berikutnya akan dimulai pada offset 1200, dan dengan demikian Anda akan memiliki lagi file sebesar 1200bytes (+ apa pun yang ditulis_proses lain), dengan 1200 karakter null terkemuka! Bukan apa yang Anda inginkan , saya kira.
Jika other_process
dibuka file.txt
di "append mode", maka setiap kali ia menulis, pointer akan secara aktif mencari ke akhir file. Karena itu, ketika Anda memotongnya, ia akan "mencari" sampai byte 0, dan Anda tidak akan memiliki efek samping yang buruk! Ini yang Anda inginkan (... biasanya!)
Perhatikan bahwa ini berarti Anda perlu, ketika Anda memotong file, untuk memastikan bahwa semua yang other_process
masih menulis ke lokasi itu telah membukanya dalam mode "append". Jika tidak, Anda harus menghentikannya other_process
, dan mulai lagi, sehingga mereka mulai menunjuk di awal file alih-alih lokasi sebelumnya.
Referensi: /programming//a/16720582/1841533 untuk penjelasan yang lebih bersih, dan contoh singkat yang bagus tentang perbedaan antara mode log normal dan append logging di /programming//a/984761/1841533