2012-09-25 87 views
0

可能重複:
C# - from time to time check if a file exists and read from it正在拷貝文件嗎?

我使用的文件的專家以檢查文件是否在目錄craeted。如果是,那麼我想打開它並移到另一個目錄。

我的方法也是使用FileShare.None來確保獨佔訪問。我所做的是:

class Program 
    { 
     private static void Main(string[] args) 
     { 
      FileSystemWatcher fileWatcher = new FileSystemWatcher(); 
      fileWatcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
      fileWatcher.Created += fileWatcher_Created; 
      fileWatcher.EnableRaisingEvents = true; 
      Console.ReadLine(); 
     } 

     private static void fileWatcher_Created(object sender, FileSystemEventArgs e) 
     { 
      WorkOnFile(e.FullPath); 
     } 


     //must be done completely. How do I ensure it? 
     private static void WorkOnFile(string fileName) 
     { 
      using (FileStream f = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) 
      { 
       Thread.Sleep(40000); // some long operations 
      }    
     } 
    } 

底線是,要完全做到WorkOnFile()且只有一個一個文件的時候了。如果一個文件被複制,那麼我需要再次撥打WorkOnFile(),直到它完全被複制,並且沒有進程正在使用它。

我該如何達到目標?

+1

我認爲[這個SO後(http://stackoverflow.com/questions/12582874/filesystemwatcher-and-write-completion/ 12584075#12584075)試圖達到或多或少相同的目的。否則,你能否更詳細地解釋你的問題是什麼:必須知道創建的文件何時完成寫入以便複製它或其他內容? – mbarthelemy

+0

創建隊列,將「文件複製操作」添加到隊列並擁有消費者線程。如果文件複製失敗,請將複製請求重新排隊到隊列中。 – Patrick

+0

是的,正好 - 必須知道創建的文件何時寫完 –

回答

1
//must be done completely. How do I ensure it? 
    private static void WorkOnFile(string fileName) 
    { 
     while(true){ 
      try{ 
       using (FileStream f = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.None)) 
       { 
        Thread.Sleep(40000); // some long operations 

        break; //exit while() infinite loop 
       } 
      } 
      catch(Exception e){ 
       //file is locked because being written. wait a few seconds then retry 
       Thread.Sleep(10000); 
      }  
     }  
    } 
+0

我寧願使用do ...而 –

+1

隨意這樣做;-)你認爲我或其他人回答你的問題嗎? – mbarthelemy

2

如果您需要儘快移動文件,您可以嘗試使用FileWatcher來監視'LastWrite',並在一小段延遲後嘗試移動該文件。

我不得不做很類似的事情,但並不着急,只是重要的是文件被可靠移動。所以,我用來代替System.Timers.Timer運行一次一分鐘:

var scanDirectoryIn = new DirectoryInfo(folderIn); 
foreach (var fileInfo in scanDirectoryIn.GetFiles()) 
{ 
    if (fileInfo.Extension != ".csv") continue; 
    if (DateTime.UtcNow.Subtract(fileInfo.LastWriteTimeUtc).TotalMinutes < 5) continue; 
    try 
    { 
    fileInfo.MoveTo(folderOut + "\\" + fileInfo.Name); 
    } 
    catch (Exception) {} 
} 
+0

正在複製大文件時,LastWriteTime不會不斷變化。但是,在複製文件時,CreationTime和LastWriteTime保持不變。 –