【问题标题】:Delphi - Write/read files in a shared environmentDelphi - 在共享环境中写入/读取文件
【发布时间】:2012-07-25 15:00:08
【问题描述】:

我对放置在 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;

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

有什么想法吗?

谢谢!

【问题讨论】:

  • 尝试找出锁定文件的进程。这可能是另一个过程,例如防病毒、备份、索引服务。
  • 我不这么认为:写入文件的计算机运行 Windows 2008 Server,但它没有任何防病毒软件,并且备份在夜间工作。而且,最重要的是,如果我单独运行服务器或客户端程序,我没有任何问题,而如果我同时运行两者,我总是会发生冲突..
  • 我遇到了完全相同的问题。在服务器中,这可能是因为两个服务器实例尝试同时写入。在客户端中,我不知道,我只是小心翼翼地捕捉并优雅地忽略异常,并在代码中用强硬的注释说 它永远不应该发生,但它确实发生了
  • 不要让客户端直接访问服务器上的文件。通过网络服务器公开文件怎么样?

标签: delphi file process share


【解决方案1】:

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

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

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

【讨论】:

  • 我想我会使用 TCP/IP 协议(​​我已经在同一个程序中使用它来进行其他数据交换);唯一不好的是我发现 TCP/IP 比直接文件访问要慢。谢谢大家!
  • 为什么 TCP/IP 会比文件访问慢?网络文件系统运行在 TCP/IP 之上。
  • 也许你是对的,但我看到读取小文本文件(位于 Windows Server 2008 计算机的共享目录中)+ 通过 TCP/IP(由 Indy 组件)将它们发送到客户端程序明显比客户端计算机直接读取相同文件要慢..对此有什么想法吗?
  • 热点新闻!我尝试在本地目录中测试相同的情况(服务器和客户端程序都运行在同一台Win 7 64位PC上,使用同一台PC中的文件,没有网络),我发现了相同的结果:有时存在文件写入服务器或文件读取客户端中的“其他进程使用的文件”异常。所以 Arnaud Bouchez 的回答并没有解释这种情况。我正在使用 Delphi Light Edition 7.3.4.3 (build 8.1)..
  • 1.网络文件夹使用缓存(这是其锁定失败的原因之一),因此它比始终通过 TCP/IP 发送内容要快。您可以通过在 TCP/IP 上实施一些巧妙的协议来获得更好的速度,并在客户端级别进行缓存。 2.关于你本地目录的问题,说明你的实现比想象的还要差。您可以在您的情况下使用file locking API。但在网络上,even this API won't be safe
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
相关资源
最近更新 更多