基本上我正在尝试做的是查看新文件,这些文件被放入具有特定文件扩展名(* .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);
}
答案 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);