C# 如何在写入文件时等待

C# 如何在写入文件时等待,c#,c++,locking,C#,C++,Locking,我有许多写文件的进程(任何文件都可以写一次)。 它们打开、写入和关闭文件。 另外,我有许多进程是读取文件。文件大小可以不同。 需要这样:当某个进程试图读取此时正在写入的文件时,我需要在写入后关闭文件时读取全部内容。我需要锁定写入,等待读取时解锁。 重要提示:若文件读取文件,但不能这样做,它将自己写入文件。 1.尝试读取文件 2.如果文件不存在,请写入文件 因此,对于异步模式,可能有多个进程因为无法读取而想要写入文件。我需要锁定文件写入,所有读卡器都应该等待此操作。处理此问题的标准方法是写入临时文

我有许多写文件的进程(任何文件都可以写一次)。 它们打开、写入和关闭文件。 另外,我有许多进程是读取文件。文件大小可以不同。 需要这样:当某个进程试图读取此时正在写入的文件时,我需要在写入后关闭文件时读取全部内容。我需要锁定写入,等待读取时解锁。 重要提示:若文件读取文件,但不能这样做,它将自己写入文件。 1.尝试读取文件 2.如果文件不存在,请写入文件


因此,对于异步模式,可能有多个进程因为无法读取而想要写入文件。我需要锁定文件写入,所有读卡器都应该等待此操作。处理此问题的标准方法是写入临时文件名,然后在写入完成后重命名文件


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

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


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

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

类Unix系统

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

Linux的文档如下:

请注意,
fcntl()
不仅执行锁定,还执行许多操作

还请注意,在大多数情况下,锁定类unix系统是一种建议,即一种合作努力。双方都必须参与,完全忽略锁是可能的。强制锁定是可能的,但在典型范例中不使用

窗口

在windows中,强制文件锁(与
CreateFile
共享模式)和范围锁
LockFileEx
是正常的,建议锁不可用,但可以模拟它们(通常在
0xffffffff
0xffffffffffff
处使用单字节范围锁-锁定的部分实际上不必存在,因此这并不意味着文件有那么大)

备选方案

对于所描述的场景,另一种方法是简单地使用不同的名称创建文件,然后在完成后重命名它


例如,如果文件名为“data-20130719-112258-99823.csv”,则创建一个名为“tmpdata-20130719-112258-99823.csv.tmp”的文件,然后在完全写入后,将其重命名。

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

类Unix系统

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

Linux的文档如下:

请注意,
fcntl()
不仅执行锁定,还执行许多操作

还要注意的是,在大多数情况下,在类unix系统上锁定是一种建议,也就是说,是一种合作的努力。双方都必须参与,并且可以忽略锁定。强制锁定是可能的,但在典型的范例中不使用

窗口

在windows中,强制文件锁(与
CreateFile
共享模式)和范围锁
LockFileEx
是正常的,建议锁不可用,但可以模拟它们(通常在
0xffffffff
0xffffffffffff
处使用单字节范围锁-锁定的部分实际上不必存在,因此这并不意味着文件有那么大)

备选方案

对于所描述的场景,另一种方法是简单地使用不同的名称创建文件,然后在完成后重命名它


例如,如果文件名为“data-20130719-112258-99823.csv”,则创建一个名为“tmpdata-20130719-112258-99823.csv.tmp”的文件当它被完全写了,重命名它。< /p>你需要它在C或C++中更好吗?更好的C。但是我想你可以在C或C++中需要它吗?更好的C。但是我想可以是个好主意。但是当我有大量的读者/作家时,会有很多事件。文件计数可以是1KOy想法。但是当我有大量的读者/作者时e将有许多事件。文件计数可以>1k