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

时间:2010-03-25 13:16:10

标签: c# .net

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

9 个答案:

答案 0 :(得分:17)

它不干净,但有效:

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
}

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

答案 1 :(得分:2)

也许像这样打开文件 -

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

可以将其置于带有try / catch的循环中,直到成功。

答案 2 :(得分:2)

捕捉异常很贵,你应该尝试使用它:

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

在msdn页面上有一个非常明确的例子。这将为您提供有关变更,创建,删除,重命名的精彩活动。

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

或者你可以捕捉到变化事件,直到(这很棘手)它们不再被触发。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

所以,在try catch中,catch块中执行的代码应该告诉你文件是打开的。

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

exclusive reader (FileMode.Read)中打开它们制作副本,并在失败时捕获异常(因为其他人已将其打开以进行书写)。

答案 8 :(得分:0)

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

  1. 进程开始写文件“filename.xyz”
  2. 进程写入更多文件“filename.xyz”
  3. ....
  4. ....
  5. 流程完成写入文件“filename.xyz”
  6. 进程将另一个(零长度,空)文件写入名为“filename.xyz.done”的文件夹中
  7. 您可以查找“.done”文件作为开始处理文件的触发器。同样,只有在你有办法修改文件写入的过程时,这才有效。