2008-11-10 40 views
0

如果我正在閱讀共享訪問模式下的文本文件,而另一個進程會截斷它,檢測該文件最簡單的方法是什麼? (我排除了定期刷新FileInfo對象以檢查其大小的明顯選擇)是否有一些方便的方法來捕獲事件? (Filewatcher?)如何檢測C#中的截斷文件

回答

3

有,它叫FileSystemWatcher

如果您正在開發Windows窗體應用程序,您可以從工具箱中拖放它。

下面是一些使用示例:

private void myForm_Load(object sender, EventArgs e) 
{ 
    var fileWatcher = new System.IO.FileSystemWatcher(); 

    // Monitor changes to PNG files in C:\temp and subdirectories 
    fileWatcher.Path = @"C:\temp"; 
    fileWatcher.IncludeSubdirectories = true; 
    fileWatcher.Filter = @"*.png"; 

    // Attach event handlers to handle each file system events 
    fileWatcher.Changed += fileChanged; 
    fileWatcher.Created += fileCreated; 
    fileWatcher.Renamed += fileRenamed; 

    // Start monitoring! 
    fileWatcher.EnableRaisingEvents = true; 
} 

void fileRenamed(object sender, System.IO.FileSystemEventArgs e) 
{ 
    // a file has been renamed! 
} 

void fileCreated(object sender, System.IO.FileSystemEventArgs e) 
{ 
    // a file has been created! 
} 

void fileChanged(object sender, System.IO.FileSystemEventArgs e) 
{ 
    // a file is modified! 
} 

它在System.IO和System.dll中,所以你應該能夠在大多數類型的項目中使用它。

+0

不知道。 +1 – 2008-11-10 19:12:23

+0

正如我的文章所暗示的,我想到了這一點,但我很好奇是否還有其他解決方案。無論如何,我正在投票回答你的問題,因爲你給了這麼好的示例代碼! ;-) – dviljoen 2008-11-10 19:23:29

+0

那麼..你是在尋求一種「方便」的方式...我認爲沒有什麼更方便的...除了可能重新設計你的方法來解決這個問題,就像下面的@petercrabtree所說的那樣。感謝+1,我正在接近獲得另一個能力:-) – chakrit 2008-11-10 19:29:28

0

只是要咀嚼;它可能不適用於你的情況:

chakrit的解決方案是正確的,你問什麼,但我不得不問 - 爲什麼你正在閱讀一個文件,而另一個進程截斷它?

特別是,如果您沒有同步,則同時讀取/寫入文件不是特別安全,並且您可能會發現您還有其他神祕問題。

3

FSW不能可靠工作,它是異步的。假設你沒有得到一個異常,當文件被截斷時,StreamReader.ReadLine()將返回null。然後檢查尺寸是否改變。注意不可避免的競爭條件,你需要驗證關於時間的假設。