如何测试当前是否正在写入文件

我有一个应用程序,必须检查文件夹并读取复制到其中的任何文件。 如何测试当前是否正在写入该文件夹中的文件? 我只想读取已经写入所有数据并关闭的文件。

它不干净,但它的工作原理:

try { using (Stream stream = new FileStream("File.txt")) { } } catch { // Check if file is in use (or whatever else went wrong), and do any user communication that you need to } 

我并不特别喜欢使用exception作为条件,但据我所知,这是关于最简单,最好(也是唯一可靠)的方法。

也许像这样打开文件 –

 System.IO.File.Open(PathToFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None); 

这可以放在一个带有try / catch的循环中,直到它成功。

捕获exception是昂贵的,您应该尝试使用此:

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

msdn页面上有一个非常清晰的例子。 这将为您提供有关更改,创建,删除,重命名的精彩事件。

将文件复制到文件夹中,并在完成捕获重命名事件时重命名,并确保您没有读取尚未完成的文件。

或者你可以抓住变化事件直到(这很棘手)他们不再被解雇了。

我唯一能想到的是文件锁在写入时会被放在文件上,因此阻止你写入文件(抛出一个System.IOexception的文件被另一个进程锁定),但是这个不是万无一失的。 例如,可以通过打开和关闭每个块的文件来以块的forms写入文件。

所以你可以用try / catch块做到这一点:

 try { //opening the file } catch(IOException ex) { // file is open by another process } 

写入的文件通常会对其进行写锁定,因此如果您尝试将其打开以进行写入,则会失败; 但OTOH你可能有一个打开,写入和关闭文件的进程 – 然后重复。 我认为最简单和最安全的方法就是检查最近写入的文件,但不是最近的文件(例如最近2秒左右)

[le]需要考虑的另一点是,如果你有一个以chunck(open-write-close)写入数据的进程,并且你获得了该文件的独占锁(以检查该文件是否已被使用) – 而不是你的外部过程将失败。 我认为检查时间戳要好得多,只有在你有理由确定其他进程完成写入后才能获得独占锁。

当您使用System.IO.File.OpenWrite(filename)打开它时,它应该抛出IOException

因此,在try catch中,catch块中执行的代码应该告诉您文件是打开的。

选项数量。 直接想到的那个是尝试打开文件进行写入。 如果你引发exception,它仍然被写入。 等待一段时间再试一次。

或者,检查时间戳,仅在上次更改时间戳后1或2分钟尝试读取文件

使用System.IO.FileSystemWatcher确定更改的文件。

在专用阅读器( FileMode.Read )中打开它们制作副本,如果失败则捕获exception(因为其他人将其打开以进行写入)。

如果您对写入的进程有任何控制权,那么请考虑对其进行扩充,以便执行以下过程:

  1. 进程开始写文件“filename.xyz”
  2. 进程写入更多文件“filename.xyz”
  3. ….
  4. ….
  5. 进程完成写入文件“filename.xyz”
  6. 进程将另一个(零长度,空)文件写入名为“filename.xyz.done”的文件夹中

您可以查找“.done”文件作为开始处理文件的触发器。 同样,只有在您有任何方法可以修改写入文件的过程时,这才有效。