有没有办法在FileSystemWatcher.Changed事件中尝试读取之前检查文件的可读性?

时间:2014-07-17 08:51:56

标签: c# .net file filestream filesystemwatcher

我使用FileSystemWatcher监视某些文件夹以进行更改。 当它触发文件更改事件时,我需要读取该文件并更新一些内容。 问题是,当触发此事件时,即使以这种方式仍然禁止目标文件读取FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);

是否还有其他事件通知文件已结束更改? 或者无论如何要创建一些等待文件读取能力的服务员通过一些标准方式(WinAPI等)。 或者循环尝试catch是唯一的选择?

2 个答案:

答案 0 :(得分:2)

如果文件流可用,您应该使用以下帮助方法返回。

public static FileStream WaitForFile(string fullName)
{
    FileStream fs = null;
    int numTries = 0;
    while (true)
    {
        ++numTries;
        try
        {
            //try to open the file
            fs = new FileStream(fullName, FileMode.Open, FileAccess.Read, FileShare.None, 100);

            fs.ReadByte();//if it's open, you can read it
            fs.Seek(0, SeekOrigin.Begin);//Since you read one byte, you should move the cursor position to the begining.                    
            break;
        }
        catch (Exception ex)
        {
            if (numTries > 10)//try 10 times
            {
                return fs;//Or you can throw exception
            }
            System.Threading.Thread.Sleep(10000);//wait 
        }
    }
    return fs;
}

答案 1 :(得分:1)

Changed事件引发时,无法保证您无法访问该文件。这里'是a topic,您可能会对如何等待文件可用于Open感兴趣。