如何在写入文件时等待

时间:2013-07-19 09:57:49

标签: c# c++ locking

我有很多写文件的进程(任何文件都可以写一次)。 他们打开,写入和关闭文件。 此外,我有许多进程是读取文件。文件大小可以各种。 需要这样的:当某个进程尝试读取此时正在写入的文件时,我需要在写入后关闭文件时读取完整内容。我需要锁定写入并等待读取时解锁。 重要提示:如果文件读取文件而无法执行此操作,则它会自行写入文件。 1.尝试阅读文件 2.如果文件不存在,请写入文件

因此,对于异步模式,由于无法读取文件,因此可能有多个进程要写入文件。我需要锁定文件写入,所有读者都应该等待这个

2 个答案:

答案 0 :(得分:2)

文件锁定是特定于操作系统的事情。

类Unix系统

类似Unix的系统通常支持flock()fcntl()lockf()系统调用。但是除了lockf咨询锁之外,它不是Posix标准的一部分,因此您需要查阅特定于操作系统的文档。

Linux的文档在这里:

请注意,fcntl()不仅可以锁定许多内容。

另请注意,在大多数情况下,锁定类Unix系统是建议性的 - 即合作努力。双方必须参与并且完全忽略锁定是可能的。强制锁定是可能的,但在典型的范例中没有使用。

<强>窗

在Windows强制文件锁(带CreateFile的共享模式)和范围锁LockFileEx是正常的,并且建议锁不可用,但它们可以被模拟(通常使用单字节范围锁在0xffffffff0xffffffffffffffff - 锁定的部分不必实际存在,因此这并不意味着该文件很大。)

<强>替代

您描述的场景的替代方法是简单地使用不同的名称创建文件,然后在完成后重命名。

E.g。如果该文件被称为“data-20130719-112258-99823.csv”而不是创建一个名为“tmpdata-20130719-112258-99823.csv.tmp”的文件,那么当它被完全写入时,重命名它。

答案 1 :(得分:1)

处理此问题的标准方法是写入临时文件名,然后在写完成后重命名该文件。

等待文件的其他进程需要监视真实文件的存在(使用文件系统观察程序或类似机制)。当文件“出现”时,写作已经完成。