【发布时间】:2010-10-22 14:22:47
【问题描述】:
在 C#/.NET 中创建空文件的最简单/规范的方法是什么?
到目前为止我能找到的最简单的方法是:
System.IO.File.WriteAllLines(filename, new string[0]);
【问题讨论】:
在 C#/.NET 中创建空文件的最简单/规范的方法是什么?
到目前为止我能找到的最简单的方法是:
System.IO.File.WriteAllLines(filename, new string[0]);
【问题讨论】:
仅使用 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 方法的最后中止,就在返回值之前.. .
【讨论】:
using (File.Create(filename)) ;,但我喜欢File.Create(filename).Dispose();的简单性
Close() 也会释放资源。 Close() 只需调用 Dispose - 请参阅 github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
或
File.CreateText("path").Close();
【讨论】:
File.WriteAllText(string, string) 使用 "UTF-8 编码没有字节顺序标记 (BOM)"。如果您仍然看到一个,那将是 WriteAllText 或其文档中值得报告的错误。
Encoding.UTF8 返回一个输出字节顺序标记 (BOM) 的编码器。您可以使用new UTF8Encoding(false) 获取不输出BOM 的UTF8 编码器。
WriteAllText 在以前的 .NET 版本中是否真的表现不同。但是,为了更加确定,只需跳过编码部分并改用File.WriteAllBytes(path, new byte[] { });。
System.IO.File.Create(@"C:\Temp.txt");
正如其他人所指出的,您应该处理此对象或将其包装在一个空的 using 语句中。
using (System.IO.File.Create(@"C:\Temp.txt"));
【讨论】:
为避免意外覆盖现有文件,请使用:
using (new FileStream(filename, FileMode.CreateNew)) {}
...并处理文件已存在时将发生的 IOException。
File.Create,在其他答案中建议,如果文件已经存在,它将覆盖文件的内容。在简单的情况下,您可以使用File.Exists() 缓解这种情况。然而,在多个线程和/或进程试图同时在同一个文件夹中创建文件的情况下,需要更强大的东西。
【讨论】:
if (!File.Exists(file)) // then create file 是许多开发人员遵循的反模式。更好地执行创建并捕获任何异常,从而使您的代码更加线程安全。
您可以将方法链接到返回的对象,这样您就可以立即关闭您刚刚在单个语句中打开的文件。
File.Open("filename", FileMode.Create).Close();
【讨论】:
创建空文件的一个常见用例是在没有更复杂的进程通信的情况下触发不同进程中发生的其他事情。在这种情况下,从外部世界的角度来看,让文件创建是原子的会有所帮助(特别是如果被触发的事物将删除文件以“使用”触发器)。
因此它可以帮助在您要创建的文件所在的目录中创建一个垃圾名称 (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);
}
【讨论】:
Path.GetTempFileName() 将创建一个唯一命名的空文件并返回它的路径。
如果您想控制路径但获取随机文件名,您可以使用 GetRandomFileName 只返回文件名字符串并将其与 Create 一起使用
例如:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);
【讨论】: