使用io.Copy() 複製時稀疏檔案仍然很大
使用io.Copy() 複製稀疏檔案時,它們意外地變成目的地較大。可以採取什麼措施來防止這種情況?
背景
io.Copy() 傳送原始位元組,不知道稀疏檔案屬性。稀疏文件可以有效存儲,但資料中存在漏洞。 io.Copy() 無法傳達此洞訊息,導致複製過程中稀疏性遺失。
解決方案
要解決此問題,需要繞過io.Copy() 並直接使用系統呼叫套件。具體方法如下:
-
偵測空洞:使用 lseek(2) 中的 SEEK_HOLE 和 SEEK_DATA 特殊值來定位稀疏檔案中的空洞和資料區域。
- 自訂查找值:特定於平台的 SEEK_HOLE 和 SEEK_DATA 值是必需的。確定支援平台的這些值。
-
修改讀取模式:識別包含資料的區域並從中讀取資料。
-
考慮檔案打孔: 在 Linux 上,您可以嘗試使用 Fallocate(2) 在目標檔案的末尾打一個洞。如果不支持,請寫入歸零塊來模擬空洞。
其他注意事項
-
檔案系統支援:並非所有檔案系統都支援孔,例如 FAT32。檢查目標檔案系統是否支援漏洞。
-
來源和目標差異:驗證來源和目標檔案是否駐留在同一檔案系統上。如果是這樣,請考慮使用 syscall.Rename() 或 os.Rename() 來移動檔案而不進行複製。
有關更多見解,請參閱有關在 tar 檔案中寫入稀疏檔案的 Go 問題 #13548 .
以上是## 為什麼稀疏檔案用 io.Copy() 複製時會變大?的詳細內容。更多資訊請關注PHP中文網其他相關文章!