1

我有两个程序在同一个文件上工作我希望第一个程序定期检查文件,如果有任何更改对文件进行操作并将其清空。另一个程序写入文件。当第二个程序尝试在文件上写入时会出现问题,因为它是从第一个程序开始使用的,是否有(如果有任何实现的 C# 程序会更好)算法来处理这个问题?

4

2 回答 2

4

要检查文件是否已更改,您可能首先检查其时间戳。在伪代码中,您可以在监控程序中尝试这样的操作:

try {
  if(FileTimeStampHasChanged(FileName)) {
    //Attempt to do something with the file
  }
}
catch {
  // Handle or ignore the exception if you can't open the file (maybe the other application hasn't finished writing). You can always retry later.
}

但是,我强烈推荐完全不同的方法。这是我建议的选项。

  1. 如果你可以改变写入程序,让它写入一个临时文件(例如output.$$$)并让它在写入完成后立即重命名。重命名是即时的,不会导致任何锁定。根据我的经验,这是并发访问的最佳简单解决方案之一。
  2. 如果你不能改变写作程序,那就修改阅读程序。使用我在第 1 点中描述的逻辑,让它尝试重命名文件以读取并处理重命名的副本。如果重命名失败,则意味着编写器没有完成,稍后可以尝试。
  3. 如果您无法更改任何程序,那么您可以制作自己的“交通管理员”应用程序来实现第 1 点。这需要更多的工作,但仍然可行。就是这样:
    • 将 Writer 配置为写入文件夹,例如“Output”。
    • 将阅读器配置为从另一个文件夹读取,例如“输入”。
    • 编写您的 Traffic Warden 以监控输出文件夹,并在文件更改时将其移动到输入文件夹。移动也是即时的(实际上与重命名操作相同)。
于 2012-04-17T16:41:13.033 回答
0

您正在使用FileStream 构造函数使用FileShare.Write 或 ReadWrite在两个程序中寻找打开文件。

如果您以这种方式打开文件,则两者都可以写入。请注意,您必须在 2 个程序之间手动实现一些同步机制,这样它们就不会覆盖彼此的数据。

每次写入后关闭文件并等待文件在打开时解锁可能是更容易的选项,具体取决于访问模式。

请注意,如果您无法控制其中一个程序,您唯一的选择就是等到程序中的文件完成(您可以强制其他程序关闭文件句柄,但您只是不想这样做因为它可能会损坏数据)。

于 2012-04-17T16:41:54.720 回答