delphi - Delphi:拒绝其他进程访问文件

标签 delphi file

如何拒绝其他进程访问(仅写)文件?我会一直读\写一个文件。

我用

FileOpen('c:\1.txt', fmOpenReadWrite or fmShareDenyWrite)


但是(开始将文件加载到StringList)之后出现错误


无法打开文件C:\ 1.txt。该进程无法访问该文件,因为该文件正在被其他进程使用。”


只有我打开文件。

最佳答案

在这里,错误消息实际上是有点误导。无法加载到字符串列表的原因是因为您已经以读/写方式打开了文件。

如果您检查TStrings.LoadfromFile的实现:

procedure TStrings.LoadFromFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;


您看到它尝试以“ DenyWrite”条件打开文件,但是您已经以写模式打开文件。这就是它失败的原因。

您可以改用LoadFromStream来解决。

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone);
  try
    Stringlist.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;


请注意,您将需要使用fmShareDenyNone使其在这种情况下起作用。再说一遍,您可能可以重用从OpenFile获得的Read / Write句柄,也许可以执行以下操作:

procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TStream;
  iPosition : Int64;
begin
  Stream := THandleStream.Create(FHandle); //FHandle is the read/write handle returned by OpenFile
  try
    iPosition := Stream.Position;
    Stream.Seek(0, soFromBeginning);
    Stringlist.LoadFromStream(Stream);
    Stream.Position := iPosition;
    //Restore stream position.
  finally
    Stream.Free;
  end;
end;


但是请注意,这些方法可能会有一些我不知道的“陷阱”。

关于delphi - Delphi:拒绝其他进程访问文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6393170/

相关文章:

delphi - 在新 Hook 的 LoadEr String 方法中读取字符串列表时出现堆栈溢出异常

delphi - 在 Delphi 控制台中创建 Spinner

c - 如何确定 C 中的 Unix 文本文件?

javascript - Typescript/Javascript 无需用户交互即可加载现有文件

Linux从目录中复制选定的文件并以目录名命名它们

algorithm - 一个数除以另一个数多少次,剩下多少?

delphi - "Modern looking SelectDirectory function"在哪里?

delphi - 除了 "Compiling"选项之外,还有哪些选项可以更改 64 位的代码生成?

java - 在java中如何解锁文件或写入excel打开的文件

file - scala.io和Scala 2.9的简单IO指南?