この記事は、 Delphi Advent Calendar 2012 の16日目のものです。
巨大なファイルの作成に時間がかかる場合、途中で他のプログラムの動作によってディスク容量が足りなくなることがたまにあります。
出力されるファイルのサイズが予めわかっている場合は、それを回避するためにヌルバイトで埋めたファイルを作成して容量を事前に確保したりします。
Delphiからヌルバイトで埋めたファイルの作成を試してみます。
ファイルシステムがNTFSであることが前提です。
create_null_file.dpr
program create_null_file; {$APPTYPE CONSOLE} uses System.SysUtils , System.Classes ; var FileStream: TFileStream; Buffer: Byte; begin FileStream := TFileStream.Create('test.dat', fmCreate); try (* 1GB - 1B までシークする *) FileStream.Seek(1024 * 1024 * 1024 - 1, soBeginning); (* ヌルバイトを書き込み *) Buffer := 0; FileStream.Write(Buffer, SizeOf(Byte)); finally FreeAndNil(FileStream); end; end.
Makefile
all: dcc32 create_null_file.dpr
実行結果
C:\Users\tokibito\Desktop\create_null_file>create_null_file C:\Users\tokibito\Desktop\create_null_file>dir ドライブ C のボリューム ラベルは OS です ボリューム シリアル番号は 0000-0000 です C:\Users\tokibito\Desktop\create_null_file のディレクトリ 2012/12/04 05:05 <DIR> . 2012/12/04 05:05 <DIR> .. 2012/12/04 04:49 446 create_null_file.dpr 2012/12/04 04:49 956,928 create_null_file.exe 2012/12/04 04:39 33 Makefile 2012/12/04 05:08 1,073,741,824 test.dat 4 個のファイル 1,074,699,231 バイト 2 個のディレクトリ 45,478,821,888 バイトの空き領域 C:\Users\tokibito\Desktop\create_null_file>
このコマンドはファイルシステムがNTFSだと一瞬で終わります。参考ページにも書かれてますが、ファイルシステムがFAT32の場合、シークしてもディスクへの書き込みが発生するため、実データを書き込むのと変わりません。