IOException未使用System.IO.FileSystemWatcher功能处理

时间:2013-10-08 15:28:48

标签: c# filesystemwatcher

基本上我正在尝试做的是查看新文件,这些文件被放入具有特定文件扩展名(* .req)的文件夹中,因此我开始使用System.IO.FileSystemWatcher功能进行设置。所以在我开始我的程序后,我只是将一组* .req文件复制到我看过的文件夹中,它们似乎第一次正常运行而没有任何错误。随后将重命名,处理,然后删除文件。我随后将重新复制相同的* .req文件,现在这次吹出IOException是未处理的错误,详情如下:

    System.IO.IOException was unhandled
    HResult=-2147024864
    Message=The process cannot access the file 'C:\accucom\reqdir\hcd - Copy (2).req' because it is being used by another process.
    Source=mscorlib
    StackTrace:
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.IO.File.InternalCopy(String sourceFileName, String destFileName, Boolean overwrite, Boolean checkHost)
    at System.IO.File.Copy(String sourceFileName, String destFileName)
    at CollectV2.CollectV2.OnChanged(Object source, FileSystemEventArgs e) in C:\accucom\CollectV2\CollectV2.cs:line 375
    at System.IO.FileSystemWatcher.OnCreated(FileSystemEventArgs e)
    at System.IO.FileSystemWatcher.NotifyFileSystemEventArgs(Int32 action, String name)
    at System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* overlappedPointer)
    at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
    InnerException: 

以下是我正在使用的代码片段,因为我想知道我在这里可能缺少的内容:

        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = GlobalVars.REQpath;
        // Only watch *.req files.
        watcher.Filter = "*.req";
        watcher.Created += new FileSystemEventHandler(OnChanged);

        // Begin watching.
        watcher.EnableRaisingEvents = true;

        // Wait for the user to quit the program.
        Console.WriteLine("Press \'q\' to quit the sample.");
        while (Console.Read() != 'q') ;

    // Define the event handlers. 
    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        // Specify what is done when a file is changed, created, or deleted.
        Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
        string rqfile = e.FullPath.Replace(".req", ".re0");
        //System.IO.File.Delete(rqfile);
        System.IO.File.Copy(e.FullPath, rqfile);
        System.IO.File.Delete(e.FullPath);

        ThreadPool.QueueUserWorkItem(wcbdoRequestFile, rqfile);
    }

2 个答案:

答案 0 :(得分:2)

我认为问题出在以下几个方面:

System.IO.File.Copy(e.FullPath, rqfile);
System.IO.File.Delete(e.FullPath);

我猜测问题是你在更改文件时仍然打开它来响应正在更改的文件。

理想的解决方案是针对正在更改文件的程序,以便在程序完成文件并将其关闭后通知程序。

如果失败了,我发现的唯一方法就是重复尝试复制/删除操作,直到成功,等待每次尝试之间的片刻。那当然不是很好,但是如果不能与其他程序通信,那么你可以做的就是它。

答案 1 :(得分:0)

我最终使用以下代码避免了我收到错误,但仍然不明白为什么它必须等待某个进程才能完成:

        System.IO.File.Delete(rqfile);
        while (true) {
            try
            {
                System.IO.File.Copy(e.FullPath, rqfile);
                break;
            }
            catch { }
        }
        System.IO.File.Delete(e.FullPath);