我正在写一个文本文件。我希望文本文件最大为1024B。达到此限制时,我想显示一条消息,但此if (fi1.Length < 1024)
检查无法正常工作
string file1 = "firstFile.txt";
TextWriter tx1 = new StreamWriter(new FileStream(file1, FileMode.Append));
FileInfo fi1 = new FileInfo(file1);
if (fi1.Length < 1024)
{
tx1.WriteLine("Babloooooooooooooooooo {0} ", i);
}
else
{
Console.WriteLine("Limit reached")
}
答案 0 :(得分:3)
检查文件信息只能在第一次使用。您在示例代码中获得的信息仅与该时刻相关,并且不会跟踪事后对该文件所做的任何更改。
问题的实际原因是当您进行检查时,相关文本编写器的缓冲区尚未刷新。当您调用写入文本时,它将被放入内存中,直到缓冲区已满,或者您手动将其刷新。每次调用后刷新文本编写器,并检查流的长度以获得预期的结果。
我在下面添加了一个可以满足您需求的示例。
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实例都放在using块中。对于公开IDisposable接口的任何类型,这是最佳实践。您可以随时手动处理事务,但using block将确保正确清理资源,即使存在异常。
答案 1 :(得分:0)
在将文本保存到文件之前,请检查字符串是否大于1024.如果仅使用一部分yourStr.Substring(0,1024)保存此部分并显示消息。
您应该知道文件大小取决于编码。
var str = "asdasdasd";
using (var sw = new StreamWriter("file.txt"))
{
var temp = str;
if (temp.Length > 1024)
{
temp = temp.Substring(0, 1024);
Console.WriteLine("Limit reached");
}
sw.Write(temp);
}