기본적으로 내가하려는 것은 특정 파일 확장명 (* .req)을 가진 폴더에 들어갈 새 파일을 감시하므로 시스템을 사용하여 설정하기 시작했습니다. .IO.FileSystemWatcher 기능. 그래서 프로그램을 시작한 후 * .req 파일 그룹을 내 감시 폴더에 복사하기 만하면 오류없이 처음부터 잘 실행되는 것처럼 보입니다. 그런 다음 파일의 이름이 바뀌고 처리 된 다음 삭제됩니다. 나는 이후에 걸쳐 같은 * 같이 .req 파일을 다시 복사합니다 지금이 시간은 구체적으로 다음과 같이 IOException가 처리되지 않은 오류했다 불면 : 여기 IOException이 System.IO.FileSystemWatcher 기능을 사용하여 처리되지 않았습니다.
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:
내가 사용하고 코드의 조각이다 궁금으로 무엇을 나는 여기에 누락 될 수 있습니다 :
System.IO.File.Copy(e.FullPath, rqfile);
System.IO.File.Delete(e.FullPath);
나는 문제가 프로세스를 변경하는 동안 변경되는 파일로 반응한다는 것을 추측하고있어 :
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);
}
다음 명령을 사용하여 sleep (250)이있는 임의의 * .req 파일에 대한 폴더의 디렉토리 : files = System.IO.Directory.GetFiles (GlobalVars.REQpath, "* .req", SearchOption.TopDirectoryOnly); 문제는 클라이언트 프로그램이 배치 할 수있는 네트워크 폴더에 경로가 있다는 것입니다. 그러나이 전용 서버가 실제로이 방법을 사용하여 파일을보기 전에 5-6 초가 걸릴 수 있음을 알았습니다. 가능하다면 아마도 더 빠른 방법을 찾고 궁극적으로 오류없이 작동해야합니다. – jfalberg