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

本文关键字:创建 文件 可以通过 文本 StreamWriter 写入 如果没有 | 更新日期: 2023-09-27 18:13:47

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

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

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

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

顺便说一下,我必须先打开一个流来写,然后才能检查是否有文本,因为代码中有一些其他的逻辑。

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

如果您想从用户那里一点一点地获取输入,您可以将您的源代码设置为StringBuilder,然后在完成后提交到磁盘

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

延迟打开文件直到第一个输出可以解决这个问题,但它可能会创建一个新的文件(如果创建文件时出现权限错误,您将直到稍后才会发现,可能当操作人员不再在计算机上时)。

你现在的方法很好。我不认为有必要测试File.Exists,但是,如果你只是关闭一个流到它。还要考虑竞争条件:

  1. 你发现文件是零长度
  2. 另一个进程写入文件
  3. 删除文件

还要考虑到您可能有创建文件的权限,而不是在创建后删除它!

正确地做到这一点需要使用原始的Win32 API,正如我在前面的回答中所描述的那样。请注意,第一个文件句柄可以使用. net流,只要指定等同于FILE_SHARE_WRITE

重新审视您的假设,即您必须在检查内容之前打开流。