Delphi - 在共享环境中写入/读取文件

标签 delphi file process share

我对放置在 LAN 中的文件有一些问题:有一个 Delphi 程序(服务器)应该写入一些文件,这些文件只能由多个 Deplhi 程序(客户端)读取。 我在服务器中使用这些简单的指令进行写入(DataList 是一个 TStrings):

Stream:=TFileStream.Create(filePath,fmOpenWrite or fmShareDenyWrite);
try
 DataList.SaveToStream(Stream);
finally
 Stream.Free;
end;

客户端每 5 秒检查一次上述文件是否被修改(只需检查 FileAge),如果发生修改,它们会按以下方式加载 DataList:

try
 Stream:=TFileStream.Create(filePath,fmOpenRead or fmShareDenyNone);
 DataList.LoadFromStream(Stream);
finally
 Stream.Free;
end;

通常情况下一切正常,但有时服务器或客户端会因为“该文件正在被其他进程使用”而引发异常。 我不明白问题出在哪里:我尝试了很多替代方案,但是只有服务器和只有一个客户端运行时也会发生这种情况。

有什么想法吗?

谢谢!

最佳答案

从设计上来说,网络文件系统是不可信的。至少,NFS(在 Linux 中)和 SMB(在 Windows 中)没有经过验证的锁定功能:并发访问并不安全。

您需要使用客户端-服务器协议(protocol)来确保共享数据的安全。您可以使用 TCP/IP、HTTP 或任何其他方式。

我建议使用真正的服务实现,例如 DataSnap、RemObjects 或我们的 Open Source mORMot .

关于Delphi - 在共享环境中写入/读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11652677/

相关文章:

delphi - 在 Delphi 中操作字节变量的位

algorithm - 如何归一化椭圆傅里叶系数?

multithreading - Delphi (Indy) 线程安全类

c - 更新文件中的记录文件

xml - Unix - 将包含 XML 文件的文件拆分为单个文件

c# - 消耗CPU使用率的进程

c# - 如何在进程运行期间逐行捕获进程 STDOUT 和 STDERR。 (C#)

delphi - DBGrid 获取选定的单元格

java - Eclipse RCP 4.10 Workbench 本地文件历史记录

sql - 一起使用 SQL 和 Perl - 哪些应该用于通用功能?