2013-11-26 147 views
0

我正在写入文本文件。我想要文本文件在最大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

看起来您正在写入其他文件'tx1'而不是'fi1'。还要确保在检查长度时调用'fi1.Refresh()'(如果在应用程序生命周期中保持相同的'fi1'实例) –

+1

是否还有更多的代码没有包含在这里?您没有在这段代码中写入文件。 – Carth

+1

小心使用什么编码,1024个字符,并不总是1024B。 – Max

回答

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实例都被放入使用块中。这是暴露IDisposable接口的任何类型的最佳做法。您始终可以手动处理事件,但using block将确保资源被正确清理,即使存在异常。

+0

太棒了!像魅力一样工作 – user2968369

+0

@ user2968369我在答案中添加了摘要。请阅读。 –

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); 
     } 
+0

您正在检查字符串写入大小而不是文件大小 – kenny

+0

是的我知道,但您可以简单地分配文件内容或将此变量切换到文件的内容。 – Krzysztof

+0

我认为你错过了这个问题的意图,可能只是误解了它。 – kenny

相关问题