例外の使用に切り替えて ( を使用{$I+}
)、 を使用できますtry..except
。(メイン メニューのI/O Checking
[Project Options] ダイアログでチェックを外していない限り、通常はデフォルトです)。Project->Options->Delphi Compiler->Compiling->Runtime Errors->I/O checking
このボックスがチェックされていない場合{$I-}
、 を使用するオプションが設定されますIOResult
。
継続して使用するIOResult
場合は、ファイル機能を使用した後に確認する必要があります。これをチェックすると、InOutRes 変数が に自動的にリセットされ0
、以前のエラー値がクリアされます。
AssignFile (fl, fn);
if not FileExists (fn) then
begin
ReWrite (fl);
if IOResult <> 0 then
// You've had an error.
CloseFile (fl); // Now an empty file exists
end; // if
IOResult
ユニットで見つけることができますSystem
。
ところで、古いスタイルの IO ルーチンから離れるべきです。それらは古いものであり、Unicode データでは適切に機能しません。を使用して同じことを達成できTFileStream
ます。これにより、適切な例外処理と Unicode のサポートが得られます。簡単なコンソール アプリのサンプルを次に示します (Win 7 上の XP3 でテスト済み)。
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, Classes, Windows;
type
TMyRec = record
anInt: Integer;
aBool: Boolean;
aByte: Byte;
end;
var
FS: TFileStream;
MyRec: TMyRec;
const
TheFile = 'C:\TempFiles\test.dat';
begin
MyRec.anInt := 12345;
MyRec.aBool := True;
MyRec.aByte := 128;
FS := TFileStream.Create(TheFile, fmCreate or fmOpenReadWrite);
try
FS.Write(MyRec, SizeOf(TMyRec));
// Clear the content and confirm it's been cleared
FillChar(MyRec, SizeOf(TMyRec), 0);
WriteLn('anInt: ', MyRec.anInt, ' aBool: ', MyRec.aBool, ' aByte: ', MyRec.aByte);
FS.Position := 0;
FS.Read(MyRec, SizeOf(TMyRec));
finally
FS.Free;
end;
// Confirm it's read back in properly
WriteLn('anInt: ', MyRec.anInt, ' aBool: ', MyRec.aBool, ' aByte: ', MyRec.aByte);
ReadLn;
end.