2016-03-09 90 views
0

我有一個代碼(程序)現在工作,使用選擇輸入文件,輸出文件夾,然後轉換爲XML。什麼時候/在哪裏實現FileSystemWatcher

所有變量和方法都在一個類內(另一個文件,但這沒有問題)。

無論如何。我想將其行爲改變爲hotfolder行爲;這樣,當一些文件被添加到文件夾時,它將根據已經實現的方法進行處理,並執行任何我想要的操作。

好吧,所以現在我來回答這個問題:實際上,在Form1.cs上,我得到的只是一些button_click調用。 我應該將FormS中的FileSystemWatcher + OnChanged方法,或者我應該把它放在我的Classes.cs文件(這是所有方法,變量等 - 業務邏輯文件)。 另外,我什麼時候打電話? form1初始化後,最好? 感謝您的任何意見:)

+0

FileSystemWatcher是一個昂貴的操作,人們在硬盤中的文件或文件夾更改對當前應用程序高度敏感時使用它,如果不是真的需要,則不應使用它。根據您以前的問題,您正在開發一種將文件類型轉換爲其他文件類型的工具。這是不需要爲這個techicque實施。 – Sakura

+0

我被要求實施一個HotFolder系統 - 所以... FileSystemWatcher是我的傢伙:) –

回答

1

當然,不要把你的形式的守望者。

你可以使用一種模式是這樣的:

public class DirectoryRefresher : IDisposable 
{ 
    private FileSystemWatcher FileWatcher { get; set; } 

    public DirectoryRefresher(string directorypath) 
    { 
     FileWatcher = SetupFileWatcher(directoryPath); 
    } 

    protected FileSystemWatcher SetupFileWatcher(string path) 
    { 
     var watcher = new FileSystemWatcher(path); 

     watcher.Changed += (sender, e) => { DoYourProcessing(e.FullPath); }; 
     watcher.Created += (sender, e) => { DoYourProcessing(e.FullPath); }; 
     watcher.Deleted += (sender, e) => { DoYourProcessing(e.FullPath); }; 

     watcher.EnableRaisingEvents = true; 

     return watcher; 
    } 

    public void DoYourProcessing(string filePath) 
    { 
     ... 
    } 

    public void Dispose() 
    { 
     try 
     { 
      if (FileWatcher != null) 
      { 
       FileWatcher.Dispose(); 
       FileWatcher = null; 
      } 
     } 
     catch 
     { 
      // ignored 
     } 
    } 

} 

當你知道該文件夾,你只需實例化一個DirectoryRefresher。當你想停止它,你只需Dispose()它。

+0

我會試試看。感謝您的提示:) –

+0

我一直在試圖找出如何解決它,但我couln't:如果我使用juse它這種方式,我不會訪問我父親類的變種(他們受到保護)。如果我在這個類中創建了一個新的內容實例,它會收到一個沒有數據的新副本。 –

+1

我很難在沒有看到代碼的情況下掌握完整的場景。如果一個單獨的類不適合您的使用,您可以將FileSystemWatcher附加到您的「父類」類,其中AFAICT包含您的所有應用程序邏輯。只需保留FileWatcher屬性,Setup方法並插入DoYourProcessing,即可重用您的現有邏輯。 –

相關問題