2017-07-14 44 views
0

我需要在C#中創建一個偵聽器,它將監視共享文件夾(UNC路徑),並在到達時將具有特定擴展名(* .json)的文件複製到目標文件夾。這些文件可能會延遲大約半分鐘。 該文件夾永遠不會爲空。不使用FilesystemWatcher的文件夾偵聽器

問題:

  1. 文件將在一個新的子文件到達,FileSystemWatcher的不能使用,因爲它可以不聽共享文件夾子文件。

  2. 需要將文件複製並保留在文件夾中,因此我們需要確保同一文件不會被複制多次。

  3. 編輯/更新的文件需要再次複製並覆蓋目標文件夾。

  4. 其他文件將在文件夾中,新文件將到達,我們需要忽略(沒有正確的擴展名)。

我想過輪詢文件夾,但我沒有拿出一個很好的實現。

我很確定我不能使用FilesystemWatcher對象,但也許有人可以找到一個聰明的解決方案來使用它。

+1

你看到[此](http://www.c-sharpcorner.com/article/monitoring-file-system-using-filesystemwatcher-class-part2/)或[此](HTTPS:/ /stackoverflow.com/questions/35835090/filesystemwatcher-includesubdirectories-not-working-on-network-share)。 –

+0

我見過他們,不喜歡這些解決方案。我正在尋找一個沒有FileSystemWatcher的解決方案... – Shahar

+0

沒有'FileSystemWatcher',輪詢特定文件或新文件將成爲您唯一的選擇。您需要找到一個足夠響應您的應用程序的速度,但不夠大,導致您的文件服務器和網絡停滯不前。 –

回答

2

您的問題的一個解決方案可能是您可以經常檢查位置一段時間,並自行檢查更改。

這不是一個完整的解決方案,而是一個想法。

public async Task FindMyFile(string filePath) 
    {   
     int retries = 0; 
     this.Founded = false; 
     while (!this.Founded) 
     { 
      if (System.IO.File.Exists(filePath)) 
       this.Founded = true; 
      else if (retries < this.maxTries) 
      { 
       Console.WriteLine($"File {filePath} not found. Going to wait for 15 minutes"); 
       await Task.Delay(new TimeSpan(0, 15, 0)); 
       ++retries; 
      } 
      else 
      { 
       Console.WriteLine($"File {filePath} not found, retries exceeded."); 
       break; 
      } 
     } 
    } 
+1

這是一個很好的起點。儘管你可能想考慮添加一個'CancellationToken',所以如果需要的話可以取消等待。 –

+0

@BradleyUffner,CancellationToken是個好主意。 – Dinch