检查文件信息只会在第一次运行。您在示例代码中获得的信息仅与该时刻相关,并且不会跟踪事件发生后对该文件所做的任何更改。
问题的实际原因是当您执行检查时,相关文本编写器的缓冲区尚未刷新。当您拨打电话以写入文本时,它将被放入内存中,直到缓冲区已满,或者您手动刷新它。每次调用后刷新文本编写器,并检查流的长度以获得预期结果。
我已经包含了一个下面的例子,你想要什么。
string file1 = "firstFile.txt";
// Placing these resources (FileStream and TextWriter) in using blocks ensures that their resources are released when you are done
// with them.
using (Stream fs = new FileStream(file1, FileMode.Append))
using (TextWriter tx1 = new StreamWriter(fs))
{
// This will only keep track of the file information when you call it.
// Any subsequent changes to the file will not update this variable.
FileInfo fi1 = new FileInfo(file1);
if (fi1.Length < 1024)
{
tx1.WriteLine("Babloooooooooooooooooo ");
// If you don't flush this line, you won't get an up to date value for 'length' below.
// Comment it out, and see for yourself.
tx1.Flush();
Console.WriteLine("The length is...", fs.Length);
}
else
{
Console.WriteLine("Limit reached");
}
}
还应该提到的是,冲洗作家和手动流将有性能损失,所以它并不总是最好的解决方案。在这种情况下,由于您正在处理大约1k的文件,因此它不会真正起作用,但对于有大量写入操作的较大文件,我不会推荐它。
此外,您将注意到TextWriter和FileStream实例都被放入使用块中。这是暴露IDisposable接口的任何类型的最佳做法。您始终可以手动处理事件,但using block将确保资源被正确清理,即使存在异常。
看起来您正在写入其他文件'tx1'而不是'fi1'。还要确保在检查长度时调用'fi1.Refresh()'(如果在应用程序生命周期中保持相同的'fi1'实例) –
是否还有更多的代码没有包含在这里?您没有在这段代码中写入文件。 – Carth
小心使用什么编码,1024个字符,并不总是1024B。 – Max