|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"一時ファイルをストリームで操作する"
タイトル:一時ファイルをストリームで操作する例です。
{
一時ファイル属性を持つファイルは通常のファイルに比べて
OSが物理ディスクへのアクセスを最小化するので、より高速
に読み書きできます。
使用後の一時ファイルは速やかに削除しましょう。
(Win32SDKの「CreateFile」の解説より)
uses Windows, Classes, SysUtils;
}
// 一時ファイル用のパス上に一時ファイル名を作成
function MakeTempFileName(Prefix: string): string;
var
Buffer: array[0..MAX_PATH] of Char;
procedure Check(Value: Integer);
begin
if Value = 0 then
raise Exception.Create(SysErrorMessage(GetLastError));
end;
begin
// 適切に設定されていれば、
// そのシステム中で最も速いディスクのパスが得られる
Check(Windows.GetTempPath(MAX_PATH, Buffer));
// Prefixを種に一時ファイル名を合成する
Check(Windows.GetTempFileName(Buffer, PChar(Prefix), 0, Buffer));
Result := Buffer;
end;
// 一時ファイル属性を持つファイルを作成
function TempFileCreate(FileName: string): Integer;
begin
Result := Windows.CreateFile(PChar(FileName),
GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS,
FILE_ATTRIBUTE_TEMPORARY, // 一時ファイル属性
0);
if Result = INVALID_HANDLE_VALUE then
raise Exception.Create(SysErrorMessage(GetLastError));
end;
// 一時ファイルをストリームで操作する
procedure TForm1.Button1Click(Sender: TObject);
var
TempFileName: string; // 一時ファイルの名前
TempFileHandle: THandle; // 一時ファイルのハンドル
TempStream: TStream; // 一時ファイルのストリーム
begin
// ‘Prefix’を種に一時ファイル名を作成
TempFileName := MakeTempFileName('ABC');
// 一時ファイルを作成
TempFileHandle := TempFileCreate(TempFileName);
try
// ハンドルをストリームで読み書き
TempStream := THandleStream.Create(TempFileHandle);
try
// TempStream.Read、
// TempStream.Write、
// などの一時ファイル操作
finally
TempStream.Free;
end;
finally
FileClose(TempFileHandle);
// 使い終わった一時ファイルは速やかに削除
DeleteFile(TempFileName);
end;
end;
「ストリーム」としてだけアクセスして(ファイルとしては使わない)
「メモリ」だけで扱っても大丈夫なサイズであれば、TMemoryStream の
方が良さそうです(このサンプルは‘石’!?)。
2001/02/14、河邦 正(GCC02240@nifty.com)
(http://member.nifty.ne.jp/kht0000/、NIFTY外へ私作Componentの
公開用)
- FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 01/02/16 -
Original document by 河邦 正 氏 ID:(GCC02240)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|