通过检测文件打开(创建)进行进程同步

时间:2009-04-17 15:03:10

标签: c++ windows file

有两个应用程序。 第一个应用程序远程到有问题的机器(我没有任何操作)并通过网络(LAN)创建一个大文件。我无法控制这个过程,也不知道它何时发生。这就是我必须要做的事情。我无法以任何方式添加,更改或更改此内容。

第二个应用程序由我编写并在找到时处理该文件。这个应用程序计划每5分钟运行一次。

当我的应用程序尝试处理文件时,可能会出现文件正在写入的情况,从而导致处理不完整和/或其他错误,因此我需要在启动之前检测文件是否已完全写入处理它。

我可以使用OpenFile()并请求读/写锁定访问。错误表示正在创建文件。

我可以用文件系统观察器做一些聪明的事情 http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

但我怀疑有一种优雅的方式我没有想过用于Windows(NT及更高版本)

6 个答案:

答案 0 :(得分:3)

我认为通过FileSystemWatcher或ReadDirectoryChanges的系统观察程序解决方案是您可以获得的最佳解决方案。您也可以在CodeProject中查看this tutorial。它还能变得多么优雅?

答案 1 :(得分:2)

标准解决方案是让编写者写入临时文件,然后在文件完成后重命名。

这样,读者(您的应用)只会在文件完成时看到该文件。

答案 2 :(得分:2)

另一个答案却不同:我突然想起了另一个做类似事情的项目。我的应用程序刚刚使用OpenFile()OF_SHARE_EXCLUSIVE(我认为),直到它成功打开文件。在这种情况下,这可以正常工作,因为我的应用程序正在访问由远程应用程序写入的文件到与我的应用程序相同的机器上的共享。我从未使用文件服务器上的文件对其进行测试,但它可以正常工作。但是,当与远程文件一起使用时,文件锁定并不总是可靠的。

答案 3 :(得分:1)

在过去,我不得不编写使用网络上的文件进行通信的软件(通过Novell文件服务器在某些* NIX应用程序和Windows应用程序之间)。为了可靠地做到这一点,我们总是说服数据文件的提供者在完成数据写入时创建一个额外的握手文件(只是一个空文件)。我们的应用程序将轮询握手文件,如果握手文件存在,我们将读取数据文件。当我们的应用程序完成读取数据后,它将删除握手文件。只要握手文件存在,握手文件就由提供者监视,该提供者没有触摸数据文件。

但是,大多数情况下,数据提供者都愿意修改他们的应用程序。我认为唯一可行的方法是从提供商处获取信号。

答案 4 :(得分:0)

一种完全不熟悉的方法是在远程计算机上安装API挂钩以捕获文件,然后启动程序或发送完成的通知。

答案 5 :(得分:0)

正如许多其他人已经指出的那样,唯一理智的方式就是额外的握手。由于这似乎不可能,我会做以下事情。

  • 编写您的应用程序以永久运行(如守护程序)。
  • 检查文件以及是否找到该文件
    • 监视它的大小,直到它在指定时间内不再增长(例如30秒)
    • 在您确定已完成转移
    • 后重命名该文件
    • 处理重命名的文件