.NET に特定のサイズのファイルを書き込むことなく作成する方法はありますか?
必要に応じて空きスペースを残して特定の位置に書き込むことができる必要があります。これを達成するための最良の方法は何ですか?
ご存じないかもしれませんが、「.Net でスパース ファイルを作成するにはどうすればよいですか?」という質問をしているかもしれません。この質問を参照してください
簡単に言えば、マネージ コードを使用してスパース ファイルを作成することはできませんが、ネイティブ API を使用して作成することはできます。問題は、スパース ファイルが「スパースのまま」であることです。したがって、後で埋め戻したい場合は、おそらくこれを行わない方がよいでしょう。開いている FileStream を使用して SetLength() を呼び出すことができます。ファイルに明示的なフィラーを明示的に書き出すという詳細を避けたい場合でも、O/S はファイルの「空の」部分を NUL で埋めます。
public override void SetLength(
long value
)
追加した
このインスタンスでは、必ずしもファイルがディスク上で物理的に拡張されているわけではないことに注意してください。ただし、「末尾のギャップ」から読み取ると NUL が取得され、ギャップに書き込むと、O/S は介在するスペースを NUL で埋め戻します。NTFS は「有効長」と「ファイル長」を別々に管理しています。SetLength を呼び出しても有効な長さは変更されず、ファイルの長さだけが変更されます。「テール ギャップ」は、有効な長さとファイルの長さにまたがるファイルの領域です。有効な長さの設定は Windows でサポートされていることにも注意してください。テール ギャップまたはファイルの最後に書き込むと、有効な長さも更新されます。
そのため、実際にファイルをすぐに拡張する必要がないため、パフォーマンスの低下を回避できますが、遅かれ早かれ、O/S は NUL で満たされたブロックを埋め戻す (そして有効な長さを新しい書き込み位置に設定する) 時間を取らなければなりません。テール ギャップに書き込みを行うと、テール ギャップが小さくなる可能性があります。
ファイルを拡張するときにディスクから既存のデータのランダムなブロックを取得すると、セキュリティ上の問題が発生することに注意してください。SSN で給与データを取得することを想像してみてください。
Windows が新しいファイル システムを追加した場合、正確な動作はさらに複雑になる可能性がありますが、少なくとも NTFS で起こることと同じくらい良いと思われます。
ファイルはディスク上の一連のバイトであり、さまざまな形式で、ヘッダー、本文などのさまざまな部分があります。したがって、空のファイルなどはありません。各バイトは予約されており、各バイト (Unicode では 2 バイト) が文字を表すためです。初期状態でも。
したがって、技術的に言えば、必要なのは、後で書き込むことができるように、ディスク上に一定量のスペースを確保することです。
そのファイルに読み取り可能または可視の文字を入れたくない場合は、多くの空白文字で満たされたファイルを作成するだけです。