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

有两个应用程序。 第一个应用程序远离有问题的机器(我没有ACESSS),并通过networking(LAN)创build一个大文件。 我无法控制这个过程,也不知道什么时候发生。 这是我需要的。 我无法以任何方式添加,更改或更改此内容。

第二个应用程序是由我写的,当它被发现时处理这个文件。 这个程序计划每5分钟运行一次。

当我的应用程序试图处理它时导致不完整的处理和/或其他错误,在文件正在被写入的过程中可能发生情况,所以在开始处理之前我需要检测文件是否已被完全写入。

我可以使用OpenFile()并请求读/写locking访问。 错误将表明文件正在创build。

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

但我怀疑有一个优雅的方式,我没有想到的Windows(NT和更高版本)

我认为你的系统观察者解决方案通过FileSystemWatcher或ReadDirectoryChanges是最好的,你可以得到。 你也可以在CodeProject上看看这个教程 。 多少优雅可以得到呢?

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

这样读者(你的应用程序)将只能看到完成后的文件。

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

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

但是,大部分时间数据提供者愿意修改他们的应用程序。 我认为唯一可行的方法就是从提供商处获得信号。

一个完全黑客的方法是在远程机器上安装一个API钩子来关闭文件,然后启动你的程序或者发送一个通知完成。

正如许多人已经指出,唯一的理智的方式是一个额外的握手。 因为这似乎是不可能的,我会做下面的事情。

  • 编写你的应用程序永久运行(如守护进程)。
  • 检查文件,如果你找到它
    • 监视它的大小,直到它不再增长指定的时间(例如30秒)
    • 在您决定完成传输后重命名文件
    • 处理重命名的文件