C# 如何在C语言中检测被截断的文件#
如果我在共享访问模式下读取文本文件,而另一个进程将其截断,那么最简单的检测方法是什么?(我排除了定期刷新FileInfo对象以检查其大小的明显选择)是否有一些方便的方法来捕获事件?(Filewatcher?) 如果您正在开发windows窗体应用程序,可以从工具箱中拖放它 下面是一些用法示例:C# 如何在C语言中检测被截断的文件#,c#,.net,C#,.net,如果我在共享访问模式下读取文本文件,而另一个进程将其截断,那么最简单的检测方法是什么?(我排除了定期刷新FileInfo对象以检查其大小的明显选择)是否有一些方便的方法来捕获事件?(Filewatcher?) 如果您正在开发windows窗体应用程序,可以从工具箱中拖放它 下面是一些用法示例: private void myForm_Load(object sender, EventArgs e) { var fileWatcher = new System.IO.FileSystemW
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中,因此您应该能够在大多数类型的项目中使用它。有,它被称为 如果您正在开发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中,因此您应该能够在大多数类型的项目中使用它。只是需要仔细研究一下;它可能不适用于您的情况: chakrit的解决方案对于您所要求的是正确的,但我必须问一下——为什么您在读取一个文件,而另一个进程会截断它
特别是,如果你没有一些同步,同时读/写文件并不是特别安全,你可能会发现你还有其他神秘的问题。只是需要仔细考虑一下;它可能不适用于您的情况: chakrit的解决方案对于您所要求的是正确的,但我必须问一下——为什么您在读取一个文件,而另一个进程会截断它
特别是,如果您没有一些同步,那么并发地读/写文件并不是特别安全,您可能会发现您还有其他神秘的问题。FSW不能可靠地工作,它是异步的。假设没有得到异常,当文件被截断时,StreamReader.ReadLine()将返回null。然后检查大小是否改变。当心不可避免的竞争条件,您需要验证有关计时的假设。FSW无法可靠工作,它是异步的。假设没有得到异常,当文件被截断时,StreamReader.ReadLine()将返回null。然后检查大小是否改变。当心不可避免的竞争条件,您需要验证有关计时的假设。我实际上是在为windows创建一个tail命令。。。我真的不想提及这一点,因为现在我已经知道了,互联网上到处都有人因为已经有很多其他的键盘实现而痛击键盘。我实际上是在为windows创建一个tail命令。。。我真的不想提及这一点,因为现在我已经提到了,互联网上到处都有人因为已经有很多其他的键盘实现而被键盘击毙。正如我的帖子所暗示的,我想到了这一点,但我很好奇是否还有其他解决方案。不管怎样,我还是要投票支持你的答案,因为你给出了这么好的示例代码!;-)好。。你在要求一个“方便”的方法。。。我认为没有比这更方便的了。。。除了重新设计你解决问题的方法,正如@petercrabtree在下面所说的那样。感谢+1,我正在接近获得另一个能力,所以:-)尽管我最终以不同的方式解决了它,这可能是最好的答案,所以你可以这样做。谢谢。正如我的帖子所暗示的,我想到了这一点,但我很好奇是否还有其他解决办法。不管怎样,我还是要投票支持你的答案,因为你给出了这么好的示例代码!;-)好。。你在要求一个“方便”的方法。。。我认为没有比这更方便的了。。。除了重新设计你解决问题的方法,正如@petercrabtree在下面所说的那样。感谢+1,我正在接近获得另一个能力,所以:-)尽管我最终以不同的方式解决了它,这可能是最好的答案,所以你可以这样做。谢谢,是的。但是ReadLine()在文件末尾时也返回null。我想只要得到空值,我就可以检查文件大小。我想我会试试看。谢谢顺便说一句,异步并不意味着它不可靠。(或者这不是你的意思吗?)因为它是异步的,所以在收到FSW通知之前,你更有可能得到EOF。这是一个不可避免的比赛条件,你可以避免。是的。但是ReadLine()在文件末尾时也返回null。我想只要得到空值,我就可以检查文件大小。我想我会试试看。谢谢顺便说一句,异步并不意味着它不可靠。(或者这不是你的意思吗?)因为它是异步的,所以在收到FSW通知之前,你更有可能得到EOF。这是一个不可避免的比赛条件,你可以避免。