【问题标题】:Creating an empty file in C#在 C# 中创建一个空文件
【发布时间】:2010-10-22 14:22:47
【问题描述】:

在 C#/.NET 中创建空文件的最简单/规范的方法是什么?

到目前为止我能找到的最简单的方法是:

System.IO.File.WriteAllLines(filename, new string[0]);

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    仅使用 File.Create 将使文件保持打开状态,这可能不是您想要的。

    你可以使用:

    using (File.Create(filename)) ;
    

    请注意,这看起来有点奇怪。您可以改用大括号:

    using (File.Create(filename)) {}
    

    或者直接拨打Dispose

    File.Create(filename).Dispose();
    

    无论哪种方式,如果您要在多个地方使用它,您可能应该考虑将其包装在一个辅助方法中,例如

    public static void CreateEmptyFile(string filename)
    {
        File.Create(filename).Dispose();
    }
    

    请注意,据我所知,直接调用 Dispose 而不是使用 using 语句在这里并没有太大的区别 - 它可以 有所作为的唯一方法是如果线程在调用File.Create 和调用Dispose 之间中止。如果存在该竞争条件,我怀疑它存在于using 版本中,如果线程在File.Create 方法的最后中止,就在返回值之前.. .

    【讨论】:

    • 有趣。大约 5 分钟前,我刚刚编写了相同的代码。我做了 File.Create(filename).Close();相同的差异...
    • 我的代码使用的是using (File.Create(filename)) ;,但我喜欢File.Create(filename).Dispose();的简单性
    • @user3791372: Close() 也会释放资源。 Close() 只需调用 Dispose - 请参阅 github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
    • 如果文件已经存在并且不是只读的,则文件内容被覆盖可能并不明显。为避免这种情况,请使用using (new FileStream(filename, FileMode.CreateNew)) { }
    • @huha:没有迹象表明 OP 想要 捕获任何此类异常。我知道我经常编写希望能够创建文件的工具,并且我希望该异常只传播到顶层。
    【解决方案2】:
    File.WriteAllText("path", String.Empty);
    

    File.CreateText("path").Close();
    

    【讨论】:

    • 使用第一个,文件长3个字节:编码代码。使用第二个文件是 0 字节(真的是空的)。
    • @Fil:你确定吗? The documentation says File.WriteAllText(string, string) 使用 "UTF-8 编码没有字节顺序标记 (BOM)"。如果您仍然看到一个,那将是 WriteAllText 或其文档中值得报告的错误。
    • 我记得我试过了。也许这是以前 .Net 版本的旧错误?如果我明确指定使用 UTF8 编码(或 unicode 或其他),该文件不为空:
    • @Fil, Encoding.UTF8 返回一个输出字节顺序标记 (BOM) 的编码器。您可以使用new UTF8Encoding(false) 获取不输出BOM 的UTF8 编码器。
    • 不知道 WriteAllText 在以前的 .NET 版本中是否真的表现不同。但是,为了更加确定,只需跳过编码部分并改用File.WriteAllBytes(path, new byte[] { });
    【解决方案3】:
    System.IO.File.Create(@"C:\Temp.txt");
    

    正如其他人所指出的,您应该处理此对象或将其包装在一个空的 using 语句中。

    using (System.IO.File.Create(@"C:\Temp.txt"));
    

    【讨论】:

    • 处理对象不是更好吗?例如:使用 (System.IO.File.Create(filepath)) { }
    • @kentaromiura:完全是我的想法,因此我的回答:)
    【解决方案4】:

    为避免意外覆盖现有文件,请使用:

    using (new FileStream(filename, FileMode.CreateNew)) {}
    

    ...并处理文件已存在时将发生的 IOException。

    File.Create,在其他答案中建议,如果文件已经存在,它将覆盖文件的内容。在简单的情况下,您可以使用File.Exists() 缓解这种情况。然而,在多个线程和/或进程试图同时在同一个文件夹中创建文件的情况下,需要更强大的东西。

    【讨论】:

    • 同意,if (!File.Exists(file)) // then create file 是许多开发人员遵循的反模式。更好地执行创建并捕获任何异常,从而使您的代码更加线程安全。
    【解决方案5】:

    您可以将方法链接到返回的对象,这样您就可以立即关闭您刚刚在单个语句中打开的文件。

    File.Open("filename", FileMode.Create).Close();
    

    【讨论】:

      【解决方案6】:

      创建空文件的一个常见用例是在没有更复杂的进程通信的情况下触发不同进程中发生的其他事情。在这种情况下,从外部世界的角度来看,让文件创建是原子的会有所帮助(特别是如果被触发的事物将删除文件以“使用”触发器)。

      因此它可以帮助在您要创建的文件所在的目录中创建一个垃圾名称 (Guid.NewGuid.ToString()),然后从临时名称执行 File.Move 到您想要的名称。否则,检查文件是否存在然后删除触发器的触发代码可能会遇到竞争条件,即文件在完全关闭之前被删除。

      将临时文件放在同一个目录(和文件系统)中可以为您提供您可能想要的原子性。这给出了类似的东西。

      public void CreateEmptyFile(string path)
      {
          string tempFilePath = Path.Combine(Path.GetDirectoryName(path),
              Guid.NewGuid.ToString());
          using (File.Create(tempFilePath)) {}
          File.Move(tempFilePath, path);
      }
      

      【讨论】:

        【解决方案7】:

        Path.GetTempFileName() 将创建一个唯一命名的空文件并返回它的路径。

        如果您想控制路径但获取随机文件名,您可以使用 GetRandomFileName 只返回文件名字符串并将其与 Create 一起使用

        例如:

        string fileName=Path.GetRandomFileName();
        File.Create("custom\\path\\" + fileName);
        

        【讨论】:

        • 恕我直言 GetTempFileName() 完全错误命名。
        • 为什么这个答案没有帮助?
        • 它没有帮助有两个原因: 1. 这个问题没有问任何关于生成随机文件名的问题,所以这会让人分心。 2.文件没有被关闭,这意味着如果你稍后尝试打开另一个文件写入器,或者移动文件,它会失败。
        • 我同意你的观点,但是: 1. 所有文件都需要一个名称。那很简单。获得一个不太可能与任何东西发生冲突的文件的便捷方法 2. 关于创建文件的问题,所讨论的代码所做的,至少,此后文件的管理并不是创建的严格部分,所以我省略了它为了简单起见,并让答案集中在问题上
        猜你喜欢
        • 2014-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-26
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多