如果没有要通过StreamWriter写入的文本,则丢弃(不创建)该文件

时间:2014-07-18 20:29:33

标签: c# streamwriter

我正在使用StreamWriter创建文件并将一些文本写入该文件。在某些情况下,我没有要通过StreamWriter写入的文本,但是在初始化StreamWriter时已经创建了该文件。

using (StreamWriter sw = new StreamWriter(@"C:\FileCreated.txt"))
{

}

目前我正在使用以下代码,当StreamWriter关闭时,检查FileCreated.txt内容是否为空,如果它是删除它。我想知道是否有比这更优雅的方法(也许是StreamWriter中的一个选项)?

if (File.Exists(@"C:\FileCreated.txt"))
{
   if (new FileInfo(@"C:\FileCreated.txt").Length == 0)
   {
      File.Delete(@"C:\FileCreated.txt");
   }
}

顺便说一下,我必须打开一个要编写的流才能检查是否有任何文本,因为代码中有其他逻辑。

3 个答案:

答案 0 :(得分:1)

如果您希望逐位获取用户的输入,可以将源代码设置为StringBuilder,然后在完成后提交到磁盘

StringBuilder SB = new StringBuilder();
...
SB.AppendLine("text");
...
if(SB.Length > 0)
    File.WriteAllLines(SB.ToString());

答案 1 :(得分:1)

延迟打开文件,直到第一个输出可以解决这个问题,但它可能会创建一个新问题(如果创建文件时出现了权限错误,您将无法找到,直到稍后,也许当操作员不再在电脑上。)

你目前的方法很不错。但是,如果你只是关闭了一个流,我就不会看到测试File.Exists的必要性。还要考虑竞争条件:

  1. 您发现该文件为零长度
  2. 另一个进程写入文件
  3. 删除文件
  4. 另外考虑您可能有权创建文件,之后不要删除它!

    正确执行此操作需要使用原始Win32 API,如I described in a previous answer。请注意,只要您指定等效的FILE_SHARE_WRITE,就可以将.NET流用于第一个文件句柄。

答案 2 :(得分:0)

重新审视您的假设,即您在检查内容之前必须打开流。只需重新组织您的逻辑。