読者です 読者をやめる 読者になる 読者になる

巨大なダミーファイルを作成する(Delphi Advent Calendar 2012-12-16)

Delphi

この記事は、 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の場合、シークしてもディスクへの書き込みが発生するため、実データを書き込むのと変わりません。

fsutilを使う場合

WindowsXP以降ではfsutilというコマンドでダミーファイルを簡単に作成できます。

C:\Users\tokibito\Desktop>fsutil file createnew test.dat 1073741824
ファイル C:\Users\tokibito\Desktop\test.dat が作成されました

このコマンドをDelphiから実行するのでもよいかもしれません。