FileSystemWatcher - 文件可以使用

sno*_*ber 12 .net c# filesystemwatcher

将文件复制到文件观察程序文件夹时,如何识别文件是否已完全复制并可以使用?因为我在文件复制期间收到多个事件.(使用File.Copy通过另一个程序复制该文件.)

Tac*_*roy 12

当我遇到这个问题时,我提出的最佳解决方案是不断尝试获取文件的独占锁定; 在写入文件时,锁定尝试将失败,本质上是答案中的方法.一旦文件没有被写入,锁定将成功.

不幸的是,唯一的方法是在打开文件时包装一个try/catch,这让我感到畏缩 - 不得不使用try/catch总是很痛苦.然而,似乎没有任何方法,所以这是我最终使用的.

修改那个答案中的代码就可以了,所以我最终使用了这样的东西:

private void WaitForFile(FileInfo file)
{
    FileStream stream = null;
    bool FileReady = false;
    while(!FileReady)
    {
        try
        {
            using(stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
            { 
                FileReady = true; 
            }
        }
        catch (IOException)
        {
            //File isn't ready yet, so we need to keep on waiting until it is.
        }
        //We'll want to wait a bit between polls, if the file isn't ready.
        if(!FileReady) Thread.Sleep(1000);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能想要在x次尝试失败后添加计数并退出尝试. (5认同)

Oli*_*bes 2

我在写文件的时候遇到了这个问题。在文件完全写入和关闭之前我收到了事件。

解决方案是使用临时文件名并在完成后重命名该文件。然后监视文件重命名事件而不是文件创建或更改事件。