首頁  >  文章  >  後端開發  >  ## 如何在 Go 中複製稀疏檔案而不擴展它們?

## 如何在 Go 中複製稀疏檔案而不擴展它們?

Susan Sarandon
Susan Sarandon原創
2024-10-26 08:31:03227瀏覽

## How Do You Copy Sparse Files Without Expanding Them in Go?

使用io.Copy() 讓稀疏檔案變得巨大

問題

使用io.Copy() 複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案時,它們經常複製稀疏檔案會膨脹

了解稀疏文件的本質

io.Copy() 傳輸原始字節,這掩蓋了稀疏文件中存在的漏洞- 沒有數據的空間實際上居住著。此資訊無法透過標準系統呼叫(如 read(2))存取。因此,io.Copy() 無法保持檔案的稀疏性。

解決問題

為了解決這個問題,我們需要使用系統呼叫套件和手動處理進行更深入的研究。 lseek(2) 系統調用,具有特殊的 SEEK_HOLE 和 SEEK_DATA 值,可用於操作檔案中的空洞。

實作

  1. 使用 syscall.Seek() 來控制檔案中的位置檔案。
  2. 決定特定於目標平台的 SEEK_HOLE 和 SEEK_DATA 值。
  3. 從包含資料的區域讀取並忽略空洞區域。

稀疏的注意事項檔案傳輸

如果你想在傳輸過程中保持檔案的稀疏性,情況就更複雜了。 Fallocate(2) 可用於嘗試在支援的檔案系統上建立漏洞。但是,某些檔案系統本質上缺乏漏洞支持,例如 FAT 系列。

附加說明

  1. 驗證來源目錄和目標目錄是否位於同一檔案系統上。如果是這樣,使用 syscall.Rename() 或 os.Rename() 而不是複製可以保留檔案的大小和屬性。
  2. 請參閱 Go Issue #13548 以進一步了解 tar 檔案中的稀疏檔案處理。

以上是## 如何在 Go 中複製稀疏檔案而不擴展它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn