質問

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')
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top