ホームページ  >  記事  >  バックエンド開発  >  ## 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() はファイルの疎性を維持できません。

問題への取り組み

これに対処するには、syscall パッケージと手動処理を使用してさらに詳しく調べる必要があります。特殊な SEEK_HOLE 値と SEEK_DATA 値を持つ Lseek(2) システム コールを使用して、ファイル内のホールを操作できます。

実装

  1. ファイル内の位置を制御するには、syscall.Seek() を使用します。ファイル。
  2. ターゲット プラットフォームに固有の SEEK_HOLE および SEEK_DATA 値を決定します。
  3. データを含む領域から読み取り、ホール領域を無視します。

スパースに関する考慮事項ファイル転送

転送中にファイルの疎性を維持したい場合、状況はより複雑になります。 Fallocate(2) を使用すると、サポートされているファイルシステム上でホールの作成を試みることができます。ただし、FAT ファミリなど、一部のファイル システムには本質的にホール サポートがありません。

追加メモ

  1. ソース ディレクトリと宛先ディレクトリが同じファイル システム上に存在するかどうかを確認してください。その場合、コピーの代わりに syscall.Rename() または os.Rename() を使用すると、ファイルのサイズと属性を保存できます。
  2. tar ファイルでのスパース ファイル処理の詳細については、Go の問題 #13548 を参照してください。

以上が## Go でスパース ファイルを展開せずにコピーするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。