Fail Jarang Kembung dengan io.Copy()
Dalam menyalin fail dengan io.Copy(), fail jarang yang besar cenderung mengembang secara tidak seimbang di destinasi mereka. Tingkah laku ini berpunca daripada pengendalian bait mentah io.Copy() yang tidak mempunyai cara untuk menyampaikan maklumat tentang lubang fail.
Mengendalikan Lubang
Untuk mengurus lubang , anda mesti mendalami pakej syscall dan bermain-main dengan nilai SEEK_HOLE dan SEEK_DATA untuk lseek(2). Malangnya, nilai ini tidak terdapat dalam pakej syscall standard atau rakan sejawatnya golang.org/x/sys.
Penyelesaian
Untuk mengatasinya, ikut langkah berikut:
Sebagai contoh, pada Linux, anda boleh menggunakan:
// +build linux const ( SEEK_DATA = 3 SEEK_HOLE = 4 )
Membaca dan Memindahkan Fail Jarang
Kesan kawasan data dan baca daripada mereka semasa membaca fail yang jarang. Untuk memindahkan fail dengan kejarang yang utuh, proses ini lebih terlibat dan memerlukan pertimbangan khusus platform.
Pendekatan Khusus Linux
Di Linux, gunakan fallocate(2) dengan FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE untuk menebuk lubang di hujung fail. Jika gagal, sodok blok sifar untuk menutup lubang.
Nota Tambahan
Atas ialah kandungan terperinci Bagaimana Anda Menyalin Fail Jarang dengan Cekap Tanpa Kembung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!