このコードを考えると:
FN := 'c:\temp\test_file.log';
AFile := TFile.Open(FN, TFileMode.fmOpenOrCreate, TFileAccess.faReadWrite, TFileShare.fsRead);
try
with TFile.OpenRead(FN) do
try
finally
Free;
end;
finally
AFile.Free;
end;
TFile.OpenRead(FN) 行で開こうとするとエラーが発生します。
使用:
with TFile.Open('c:\temp\test_file.log', TFileMode.fmOpen, TFileAccess.faRead, TFileShare.fsRead) do
try
finally
Free;
end;
も同じエラーになります。同様に:
FS := TFileStream.Create('c:\temp\test_file.log', fmOpenRead or fmShareDenyWrite);
try
finally
FS.Free;
end;
ただし、メモ帳で (読み取り専用として) ファイルを問題なく開くことができます。または、最初の TFileShare.fsRead を TFileShare.fsNone に変更すると、期待どおりに (メモ帳で) 開くことができません。
ただし、このダミー アプリの 2 つのインスタンスを実行すると、最初の 1 つが TFileShare.fsRead で開かれ、開くことができます。同じアプリケーションでファイルを 2 回開くことはできませんか? 正しくないようです。
最初にファイルを開くと:
FS := TFileStream.Create('c:\temp\test_file.log', fmOpenReadWrite or fmShareDenyWrite);
try
finally
FS.Free;
end;
上記の方法で(fsReadを使用して)もう一度開くことができます。紛らわしいのは、TFile.Open コードをステップ実行することです。最終的には、上記の TFileStream.Create とまったく同じコードを実行します。
最後にメモ。一番上の(最初の)方法を使用して開いたが、それを「グローバル」変数に割り当てた場合、内部 TFile.OpenRead(FN) 呼び出しを削除してから、別のボタンをクリックしてファイルを開こうとすると、エラーが持続します。これは、ネストされた呼び出しに関連していないことを証明しています。