多线程文件访问(锁定控制)(Multi-thread file access (locking co

2019-10-16 15:00发布

我有两个项目上,我想第一个计划,定期检查该文件相同的文件工作,并且如果所做的任何更改的文件进行操作,并清空。 其他程序写入文件。 当第二程序尝试,因为它是从第一个用在文件中写入出现问题是有一个(如果有任何实现的C#程序甚至会更好)算法来处理呢?

Answer 1:

要检查文件是否改变了你可能首先是检查其时间戳。 在伪代码,你可以尝试在监控程序是这样的:

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. 如果你可以改变,写程序,让它写入到一个临时文件(如输出。$$$),让它作为它写完,尽快将其重命名。 重命名是瞬时的,不会造成任何锁定。 这一点,在我的经验,对于并发访问的最佳简单的解决方案之一。
  2. 如果你不能改变,写程序,然后修改读数之一。 用我在第1点所述的逻辑,让它尝试重命名阅读和对重命名副本的工作文件。 如果重命名失败,那么就意味着作者不这样做,并尝试以后可以完成。
  3. 如果你不能改变的任何程序,那么你可以让自己的“交通督导员”应用程序中实现点1.它需要更多的工作,但它仍然是可行的。 这是如何做:
    • 配置作家写到一个文件夹,例如“输出”。
    • 配置阅读器从另一个文件夹来读取,例如“输入”。
    • 写下您的交通督导员,使其监视输出文件夹,在文件的变化,它移动到文件夹的输入。 感动的是瞬间,以及(这是几乎相同的操作重命名)。


Answer 2:

您正在寻找与这两个程序打开文件FileShare.Write或读写使用的FileStream构造函数 。

如果你打开的文件这样双方就能写。 请注意,您必须手动执行2个节目之间的一些同步机制,使他们不互相覆盖的数据。

每次写入后关闭文件,并等待文件打开它可能是依赖于访问模式更容易的选择时变得解锁。

请注意,如果你没有对你唯一的选择是简单地等待,直到它在你的程序与文件中完成的(你可以强制其他程序关闭文件句柄程序的一个控制,但你只是不想做随着它可能会破坏数据)。



文章来源: Multi-thread file access (locking control)