io.Copy() は、io.Reader と io の間で生のバイトを転送します。 .ライター。ただし、ファイル内のホールの位置を処理する機能がありません。これは、read(2) などの syscall がユーザーから隠蔽するサイドチャネル情報とみなされます。
管理するにはスパース ファイルを使用する場合は、syscall パッケージを使用してパラメータを手動で操作する必要があります。 lseek(2) の SEEK_HOLE 値と SEEK_DATA 値は、このプロセスに不可欠です。
ファイルをスパースとして転送するのはより複雑です。 Linux では、fallocate(2) を FALLOC_FL_PUNCH_HOLE とともに使用してパンチホールを試みることができます。 FALLOC_FL_KEEP_SIZE。それが失敗した場合は、ゼロ化されたブロックを宛先に書き込み、OS がブロックをホールに変換するよう促します。
以上が記事の本質を捉えた、質問形式の英語タイトルのオプションをいくつか示します。 **短く直接的:** * **Go で io.Copy() を使用するときにスパース ファイルを保存するにはどうすればよいですか?** * **できるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。