質問
DelphiでReWriteによってファイルが開かれたかどうかを確認する方法はありますか?
コードは次のようになります:
AssignFile(textfile, 'somefile.txt');
if not textFile.IsOpen then
Rewrite(textFile);
解決
ファイルモードを取得できます。 (少しの間、例を作成します)。
TTextRec(txt).Modeはモードを提供します:
55216 = closed
55217 = open read
55218 = open write
fmClosed = $D7B0;
fmInput = $D7B1;
fmOutput = $D7B2;
fmInOut = $D7B3;
詳細については、システムユニットでTTextRecを検索してください。
他のヒント
これを試してください:
function IsFileInUse(fName: string) : boolean;
var
HFileRes: HFILE;
begin
Result := False;
if not FileExists(fName) then begin
Exit;
end;
HFileRes := CreateFile(PChar(fName)
,GENERIC_READ or GENERIC_WRITE
,0
,nil
,OPEN_EXISTING
,FILE_ATTRIBUTE_NORMAL
,0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not(Result) then begin
CloseHandle(HFileRes);
end;
end;
これは正常に動作します:
function IsOpen(const txt:TextFile):Boolean;
const
fmTextOpenRead = 55217;
fmTextOpenWrite = 55218;
begin
Result := (TTextRec(txt).Mode = fmTextOpenRead) or (TTextRec(txt).Mode = fmTextOpenWrite)
end;
ブール変数をコンパニオンとして保持する方が簡単だとわかりました。例: bFileIsOpen
。ファイルが開かれる場所はどこでも bFileIsOpen:= true
を設定し、ファイルが開いているかどうかを知る必要があるときはいつでも、この変数をテストします。例: if(bFileIsOpen)then Close(datafile);
Josephの答えは完全に機能します-関数 filenotopen
を呼び出し、次の場合に行を変更しました
Result := (HFileRes = INVALID_HANDLE_VALUE);
to
Result := NOT (HFileRes = INVALID_HANDLE_VALUE);
「if not(Result)then begin」(および「end」)行も削除したため、常にハンドルまたは後続の割り当てを閉じて読み取りエラーが発生します
私は今このように呼んでいます
if filenotopen(filename) then
begin
assignfile(f,filename);
reset(f)
etc;
end
else
message('file open by a different program')
所属していません StackOverflow