ファイルにアクセスする前に、ファイルが使用中かどうかを確認する必要があります。Lazarus環境でそれを行う方法はありますか?
2 に答える
でファイルを開き、FileOpen(FileName, fmOpenReadWrite or fmShareExclusive)
結果を確認します。
更新(Ken White のコメントに感謝)。FileOpen
実際にファイルにアクセスできるため、これは質問に対する直接的な回答ではありませんが、チェックを実行してからファイルを開くべきではありません。そうしないと、競合状態が発生します。ファイルを開いてから、開くことが成功したかどうかを確認する必要があります。
ハンドルを使用してファイルを開き、FileOpen
そのハンドルを介してファイルにアクセスすることは、なじみがないように思えるかもしれません。ブロックRewrite
内などでファイルを開くときに、同じ目標を達成できます。try-except
Lazarus についてはよくわかりませんが、Delphitry-except
で高レベルのファイル ルーチンを使用するには、例外が発生した場合に IOResult を明示的にリセットする必要があります (セクションにSetInOutRes(0)
挿入except
)。そうしないと、次のファイル操作が失敗します。
あなたはそうしない。それを開こうとし、できない場合は例外を処理します。
最初に使用されているかどうかを確認しても意味がありません。
Your code to see if it's in use says it's not
--->>> Another app opens the file, locking it
Your code to open file fails
代わりに、通常のtry..except
ブロックを使用します。
try
FS := TFileStream.Create(YourFileName, fmOpenReadWrite, fmShareExclusive);
// Code to use file here
except
// Handle failure to access file
end;