【问题标题】:Process Synchronization by detecting file open (creation)通过检测文件打开(创建)进行进程同步
【发布时间】:2009-04-17 15:03:10
【问题描述】:

有两个应用程序。 第一个应用程序对有问题的机器是远程的(我没有访问它)并通过网络(LAN)创建一个大文件。我无法控制这个过程,也不知道它何时发生。这就是我必须解决的问题。我无法以任何方式添加、更改或更改它。

第二个应用程序是我编写的,并在找到该文件时对其进行处理。此应用计划每 5 分钟运行一次。

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

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

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

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

【问题讨论】:

    标签: c++ windows file


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      这样,阅读器(您的应用程序)只会在文件完成后才能看到文件。

      【讨论】:

      • 不幸的是,我无法访问编写器(远程进程)来实现它。
      • 是的,我注意到你已经更新了你的帖子......我不得不说有点OTT!
      • 无意冒犯,只是强调清楚:)
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        但是,大多数情况下,数据提供者都愿意修改他们的应用程序。我认为可靠地做到这一点的唯一方法是从提供者那里获得信号。

        【讨论】:

        • 我希望。很遗憾不可能。
        • 是的,如果握手文件是 SHA1 文件,您也会知道是否发生了任何数据传输问题。
        • 但是您需要一个保护 SHA1 的握手文件,因为您可以在其他应用程序将哈希写入文件时读取该文件...
        【解决方案5】:

        一种完全骇人听闻的方法是在远程机器上安装一个 API 挂钩以捕获文件关闭,然后启动您的程序或发送完成通知。

        【讨论】:

        • 很遗憾,远程进程(远程机器)无法访问。
        【解决方案6】:

        正如许多其他人已经指出的那样,唯一明智的方法是多握手。由于这似乎不可能,我会执行以下操作。

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

        【讨论】:

        • 这是一个有趣的想法。我假设您想检查大小而不是使用 OpenFile() 因为它更可靠?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-19
        • 2014-04-04
        • 1970-01-01
        • 2018-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多