2013-10-08 1 views
0

기본적으로 내가하려는 것은 특정 파일 확장명 (* .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); 
    } 

답변

2

나는 문제가이 라인에 생각 성 아프다.

이상적인 솔루션은 파일을 끝내고 프로그램을 종료했을 때 프로그램에 알리기 위해 파일을 변경하는 프로그램입니다.

내가 찾은 유일한 방법은 성공할 때까지 반복적으로 복사/삭제 작업을 시도하고 각 시도 사이에 잠시 기다리는 것입니다. 물론 그다지 좋지는 않지만 다른 프로그램과 통신 할 수 없으면 할 수있는 모든 것일 수 있습니다.

+0

다음 명령을 사용하여 sleep (250)이있는 임의의 * .req 파일에 대한 폴더의 디렉토리 : files = System.IO.Directory.GetFiles (GlobalVars.REQpath, "* .req", SearchOption.TopDirectoryOnly); 문제는 클라이언트 프로그램이 배치 할 수있는 네트워크 폴더에 경로가 있다는 것입니다. 그러나이 전용 서버가 실제로이 방법을 사용하여 파일을보기 전에 5-6 초가 걸릴 수 있음을 알았습니다. 가능하다면 아마도 더 빠른 방법을 찾고 궁극적으로 오류없이 작동해야합니다. – jfalberg

0

나는 나에게 오류를 받고 있지만 여전히 일부 프로세스가 완료 될 때까지 기다려야했다 이유를 이해하지 않습니다 피할 다음 코드를 사용하여 종료 :

나는이 있었다 원래 방법은 읽기 계속했다
 System.IO.File.Delete(rqfile); 
     while (true) { 
      try 
      { 
       System.IO.File.Copy(e.FullPath, rqfile); 
       break; 
      } 
      catch { } 
     } 
     System.IO.File.Delete(e.FullPath);