Fail Jarang Kekal Besar Apabila Disalin Menggunakan io.Copy()
Apabila menyalin fail jarang menggunakan io.Copy(), mereka secara tidak dijangka menjadi besar di destinasi. Apakah yang boleh dilakukan untuk mengelakkan perkara ini?
Latar Belakang
io.Copy() memindahkan bait mentah, tidak mengetahui sifat fail yang jarang. Fail jarang disimpan dengan cekap, dengan lubang dalam data. io.Copy() tidak dapat menyampaikan maklumat lubang ini, mengakibatkan kehilangan keterlaluan semasa proses penyalinan.
Penyelesaian
Untuk menangani isu ini, anda perlu memintas io.Copy() dan berfungsi secara langsung dengan pakej syscall. Begini caranya:
-
Kesan Lubang: Gunakan nilai khas SEEK_HOLE dan SEEK_DATA dalam lseek(2) untuk mencari lubang dan kawasan data dalam fail yang jarang.
- Peribadikan Nilai Carian: Nilai SEEK_HOLE dan SEEK_DATA khusus platform adalah perlu. Tentukan nilai ini untuk platform yang disokong.
-
Ubah suai Corak Baca: Kenal pasti wilayah yang mengandungi data dan baca data daripadanya.
-
Pertimbangkan Penebuk Fail: Di Linux, anda boleh cuba menebuk lubang di hujung fail destinasi menggunakan fallocate(2). Jika tidak disokong, tulis blok bersifar untuk mensimulasikan lubang.
Pertimbangan Tambahan
-
Sokongan Sistem Fail: Bukan semua sistem fail menyokong lubang, seperti FAT32. Semak sama ada sistem fail destinasi menyokong lubang.
-
Perbezaan Sumber dan Destinasi: Sahkan sama ada fail sumber dan destinasi berada pada sistem fail yang sama. Jika ya, pertimbangkan untuk menggunakan syscall.Rename() atau os.Rename() untuk mengalihkan fail tanpa menyalin.
Untuk mendapatkan maklumat lanjut, rujuk isu Go #13548 tentang menulis fail jarang dalam arkib tar .
Atas ialah kandungan terperinci ## Mengapa Fail Jarang Menjadi Besar Apabila Disalin dengan io.Copy()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan:Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn