2008-11-10 39 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。然后检查尺寸是否改变。注意不可避免的竞争条件,你需要验证关于时间的假设。