2012-06-26 235 views
0

我有,我用FileSystemWatcher的和移動文件從一個destiantion到另一個被創建時就簡單C#控制檯應用。我的代碼如下所示:File.Move()會自動關閉控制檯窗口在C#

public static void WatchForFiles() 
    { 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     //folder path is path to folder 
     watcher.Path = folderPath; 

     watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
      | NotifyFilters.FileName | NotifyFilters.DirectoryName; 

     //Add event handlers   
     watcher.Created += new FileSystemEventHandler(File_OnChanged);   

     //Begin watching 
     watcher.EnableRaisingEvents = true; 
    } 


    public static void File_OnChanged(object sender, FileSystemEventArgs e) 
    { 
     //destiantion path is path to folder 
     string destiantionFileFullPath = destianationPath + e.Name; 
     if (!File.Exists(destiantionFileFullPath)) 
     { 
      File.Move(e.FullPath, destiantionFileFullPath); 
     } 
    } 

當我第一次複製文件時,它正常移動。但之後或者如果我複製兩個或多個文件,我的控制檯窗口會自動關閉。我想我應該使用IAsyncResult但我不知道如何。我試過任務但這並沒有幫助。冷杉複製文件,然後刪除也沒有幫助。這是什麼原因造成的?我怎樣才能防止這種情況?在此先感謝

+0

聽起來像是你有一個異常的地方拋出。創建一個bat文件,在其中調用窗口控制檯程序,然後暫停。 – GETah

+1

從內存中我相信FileWatcher可能會在文件完全寫入磁盤之前通知您一個新文件(因此您可能試圖移動一個仍然被鎖定以便寫入的文件)。在File.Move和WriteLine中添加一個try {} catch塊,這是控制檯的例外情況 - 這可能會幫助您解決問題的底部。 – KazR

+0

當我使用try catch時,一切正常,沒有異常拋出,這很奇怪 –

回答

1

從經驗來看,使用FileWatcher的監測文件,因爲它們被轉儲和(可能的)移動它們比人會希望管理更多的麻煩。簡單的原因是,如果在應用程序關閉時將文件轉儲到目錄中,FileWatcher不會捕獲它們。我更喜歡使用定期輪詢的Timer,檢查目錄中是否存在文件並移動它們。使用這種方法,如果有新的文件夾中傾倒當應用程序下來(比如用於維護),他們會盡快將應用程序重新啓動移動和計時器開始投票

+0

謝謝你的作品更好。 –

0

不復制兩個文件:當您複製一個文件時,另一個文件被創建但提高事件被禁用,因此您不會通知事件。

嘗試掃描目錄File_OnChanged,然後你會看到這個。

它爲什麼退出?我認爲它引發了一個異常,可能寫入過程尚未完成寫入,並且您已經訪問該文件 - 這可能是不允許的。

+0

謝謝你的時間@Mario Th勺 –

相關問題