2011-02-28 112 views
0

我一直在監視網絡目錄中的文件。我最初使用FileWatcher來監視它們。我發現這些文件在使用FileWatcher時被鎖定,因此我將我的實現更改爲使用DirectoryInfo來監視我正在觀看的目錄中新到達和刪除的文件。看來在使用DirectoryInfo的同時,監視目錄中的文件也會被鎖定,從而防止文件在下載文件後被另一個應用程序刪除。我的手錶應用程序是一個Windows服務。監視目錄中的文件在使用DirectoryInfo時被鎖定

有誰能告訴我他們是否面臨問題,如果他們有,你是如何解決它?

謝謝,

+1

「我發現該文件已在使用FileWatcher被鎖定」 - 似乎不大可能.... – 2011-02-28 05:17:32

+0

你處理文件,同時通過filewatcher監控。您需要在應用程序中優雅地關閉文件句柄。 – 2011-02-28 05:49:12

+0

發佈您的代碼 - 當您有新文件時,您會做什麼? – VinayC 2011-02-28 06:00:38

回答

1

你確定無論是創建/更新文件完成嗎?如果沒有,該文件將被鎖定。

+0

有一個進程A生成2個文件(一個大小爲1KB;另一個大小爲67MB),並將其放入一個n/w文件夾中。這些文件被下載並在4到5小時後被另一個進程B刪除。我的應用程序執行的操作是,從文件到達之前檢查文件夾,直到文件被刪除,並且文件被刪除時,應用程序發出通知,指出文件已被刪除。我發現過程B能夠下載和刪除較小尺寸的文件,但較大的文件始終存在刪除問題。我沒有處理任何文件。 – Researcher 2011-02-28 07:11:28

0

即使FileWatcher應該在UNC上工作,我也遇到了很多問題。由於你的問題不是時間關鍵的,我會創建一個線程來檢查文件是否存在,睡眠幾秒鐘循環,直到發送警報的文件消失。

注意:作爲服務運行需要正在運行的用戶對遠程共享擁有網絡權限。

更新:剛在我們的網絡上做了一個快速測試。運行Windows 7 R2服務器的客戶端運行Windows 2008 R2。增加了幾個文件,無論是小型還是大型文件。在代碼運行時刪除文件沒有任何問題。即使沒有了Thread.Sleep

 bool filesDeleted = false; 

     while (!filesDeleted) 
     { 
      DirectoryInfo di = new DirectoryInfo(@"\\server\share\path\"); 
      FileInfo[] files = di.GetFiles(); 

      foreach (var file in files) 
      { 
       DateTime created = file.CreationTime; 
       string fileName = file.Name; 

       //Do what every you need to check if the two files are still there 
      } 

      Thread.Sleep(5000); 
     } 

     //Send alert 
+0

這就是應用程序運行的方式。檢查文件,睡覺,再次檢查文件。 Windows服務具有網絡權限,我能夠成功找出其中一個文件已被刪除。但是,刪除文件的應用程序無法刪除2個文件中較大的一個。在觀察器應用程序運行時,似乎在文件上放置了一些鎖。在監視目錄上是否有「finfFileList = DirectoryInfo.getFiles()」,隨後可以通過後續訪問「finfFileList.creationtime」來鎖定我正在觀看的文件? – Researcher 2011-02-28 07:56:00

+0

對不起。我雖然使用了FileSystemWather類。我不認爲它不應該對它們加鎖,但索引服務或防病毒可能會掃描這些文件。刪除大型ISO映像文件時遇到過類似的問題。在我的情況下刪除文件夾(高級屬性)上的「允許文件和文件夾進行索引」屬性修復它。 – Paaland 2011-02-28 08:02:25

+0

當觀察者應用程序未運行時,可以下載和刪除這些文件。只有當監視器應用程序運行並監視目錄時,纔會顯示鎖被放置在文件上,並且文件不能被下載文件的應用程序刪除,我們必須在以後實際手動從文件夾中手動刪除文件。 – Researcher 2011-02-28 08:39:38