2012-05-17 69 views
2

我開發了一個filewatcher程序來監視文件夾,如果文件發生任何更改,它會將該文件複製到另一個文件夾。如何在System.IO.File.Copy期間避免Filewatcher鎖定文件

但是,我發現寫入原始文件時會出現錯誤信息(例如,文件正在被另一個應用程序執行......),似乎該文件在運行[System.IO.File.Copy]複製到另一個時被鎖定夾。

是否有解決方案可以避免filewatcher/System.IO.File.Copy鎖定的原始文件?謝謝。

下面是我的代碼:

private void fileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e) 
    { 
     DateTime lastWriteTime = File.GetLastWriteTime(e.FullPath); 

     if (lastWriteTime != lastRead) 
     { 


      txtLog.Text += e.ChangeType + ": " + e.FullPath + "\r\n"; 
      txtLog.Focus(); 
      txtLog.Select(txtLog.TextLength, 0); 
      txtLog.ScrollToCaret(); 

      try 
      { 
       string myPath = e.FullPath; 
       string myFile = e.Name; 

       System.IO.FileInfo myFileInfo = new System.IO.FileInfo(myFile); 

       string myAttibs = myFileInfo.Attributes.ToString(); 

       System.IO.File.Copy(myPath, @"D:\\Folder\\Output\\" + myFile, true); 

       lastRead = lastWriteTime; 

      } 
      catch (System.IO.IOException ex) 
      { 
       System.IO.IOException myex = ex; 
      } 
      catch (System.Exception ex) 
      { 
       System.Exception myex = ex; 
      } 

     } 
    } 
+0

我認爲捕捉異常是最好的,你可以做的。 –

+0

哎呀。你真的想寫一個文件中間副本嗎?問問你自己爲什麼要把這個文件從文件夾複製到文件夾,看看你是否可以重新訪問你的設計。 – RavB

回答

1

有沒有解決這個問題的好辦法。當另一個應用程序想要寫入文件時,如果您正在將文件複製到新位置,該程序應該如何運行?

如果您願意複製損壞的文件(即在複製時寫入的文件),則必須編寫使用FileShare.ReadWrite的自己的複製方法。

3

我遇到了同樣的問題。我不喜歡我的解決方案,因爲它感覺不舒服。但它的作品:

FileSystemWatcher fsWatcher = new FileSystemWatcher(); 
fsWatcher.Created += new FileSystemEventHandler(fsWatcher_Created); 

private void fsWatcher_Created(object sender, FileSystemEventArgs e) 
{ 
    RaiseFileFoundEvent(e.FullPath); 
    while (!TestOpen(e.FullPath)) ; 
    RaiseFileCopyDoneEvent(e.FullPath); 
} 

private bool TestOpen(string filename) 
{ 
    try 
    { 
     FileStream fs = new FileStream(filename, FileMode.Open, 
      FileAccess.Write, FileShare.None); 
     fs.Close(); 
     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

private void RaiseFileFoundEvent(string fullPath) 
{ 
    // a file is found, but the copy is not guaranteed to be finished yet. 
} 

private void RaiseFileCopyDoneEvent(string fullPath) 
{ 
    // the file is found, and we know the copy is done. 
} 
+0

我不喜歡解決方案,但至少放鬆了while循環。 – tzerb

+0

*(比我剛剛刪除的評論更好的評論)*在我的生產代碼中,它檢查線程是否被中止。爲了清晰起見,我將其切出。 –