将文本文件的大小与值进行比较

时间:2013-11-26 13:30:04

标签: c# text-files

我正在写一个文本文件。我希望文本文件最大为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")
}

2 个答案:

答案 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);
        }