在C#/.NET中创建空文件最简单/规范的方法是什么?到目前为止,我能找到的最简单的方法是:
System.IO.File.WriteAllLines(filename, new string[0]);
qlfbtfca1#
只使用File.Create将使文件保持打开状态,这可能不是您想要的。您可以用途:
File.Create
// Results in compiler warning "warning CS0642: Possible mistaken empty statement" using (File.Create(filename)) ;
注意,这看起来有点奇怪,你可以用大括号代替:
using (File.Create(filename)) {}
或者直接调用Dispose:
Dispose
File.Create(filename).Dispose();
无论哪种方式,如果你打算在多个地方使用它,你可能应该考虑把它 Package 在一个helper方法中,例如。
public static void CreateEmptyFile(string filename) { File.Create(filename).Dispose(); }
请注意,就我所知,直接调用Dispose而不是使用using语句在这里并没有太大的区别--唯一 * 可能 * 有区别的方法是线程是否在调用File.Create和调用Dispose之间中止。如果存在这种争用条件,我怀疑它 * 也 * 存在于using版本中。如果线程在File.Create方法的最后终止,就在返回值之前...
using
8ljdwjyq2#
File.WriteAllText("path", String.Empty);
或
File.CreateText("path").Close();
a11xaf1n3#
System.IO.File.Create(@"C:\Temp.txt");
正如其他人所指出的,您应该处理这个对象,或者将它 Package 在一个空的using语句中。
using (System.IO.File.Create(@"C:\Temp.txt"));
2uluyalo4#
要避免意外覆盖现有文件,请使用用途:
using (new FileStream(filename, FileMode.CreateNew)) {}
...并处理文件已存在时发生的IOException。File.Create(在其他答案中建议)将覆盖文件的内容(如果该文件已经存在)。在简单的情况下,您可以使用File.Exists()缓解此问题。但是,在多个线程和/或进程试图同时在同一文件夹中创建文件的情况下,需要更强大的功能。
File.Exists()
wqsoz72f5#
您可以将方法与返回的对象链接起来,这样就可以立即关闭刚刚在单个语句中打开的文件。
File.Open("filename", FileMode.Create).Close();
bvn4nwqk6#
创建一个空文件的一个常见用例是在没有更复杂的进程通信的情况下触发其他进程中发生的事情。在这种情况下,从外部世界的Angular 来看,让文件创建原子化会很有帮助(特别是当被触发的事情将要删除文件以“消耗”触发器时)。因此,在您想要创建的文件所在的目录中创建一个垃圾名称(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); }
gpfsuwkq7#
Path.GetTempFileName()将创建一个唯一命名的空文件并返回其路径。如果您想要控制路径但获取随机文件名,则可以使用GetRandomFileName仅返回文件名字符串并将其用于Create例如:
string fileName=Path.GetRandomFileName(); File.Create("custom\\path\\" + fileName);
7条答案
按热度按时间qlfbtfca1#
只使用
File.Create
将使文件保持打开状态,这可能不是您想要的。您可以用途:
注意,这看起来有点奇怪,你可以用大括号代替:
或者直接调用
Dispose
:无论哪种方式,如果你打算在多个地方使用它,你可能应该考虑把它 Package 在一个helper方法中,例如。
请注意,就我所知,直接调用
Dispose
而不是使用using
语句在这里并没有太大的区别--唯一 * 可能 * 有区别的方法是线程是否在调用File.Create
和调用Dispose
之间中止。如果存在这种争用条件,我怀疑它 * 也 * 存在于using
版本中。如果线程在File.Create
方法的最后终止,就在返回值之前...8ljdwjyq2#
或
a11xaf1n3#
正如其他人所指出的,您应该处理这个对象,或者将它 Package 在一个空的using语句中。
2uluyalo4#
要避免意外覆盖现有文件,请使用用途:
...并处理文件已存在时发生的IOException。
File.Create
(在其他答案中建议)将覆盖文件的内容(如果该文件已经存在)。在简单的情况下,您可以使用File.Exists()
缓解此问题。但是,在多个线程和/或进程试图同时在同一文件夹中创建文件的情况下,需要更强大的功能。wqsoz72f5#
您可以将方法与返回的对象链接起来,这样就可以立即关闭刚刚在单个语句中打开的文件。
bvn4nwqk6#
创建一个空文件的一个常见用例是在没有更复杂的进程通信的情况下触发其他进程中发生的事情。在这种情况下,从外部世界的Angular 来看,让文件创建原子化会很有帮助(特别是当被触发的事情将要删除文件以“消耗”触发器时)。
因此,在您想要创建的文件所在的目录中创建一个垃圾名称(Guid.NewGuid.ToString())会有所帮助,然后执行File.Move从临时名称移动到您想要的名称。否则,检查文件是否存在并删除触发器的触发代码可能会遇到争用情况,在文件完全关闭之前将其删除。
将临时文件放在同一个目录(和文件系统)中可以提供所需的原子性。
gpfsuwkq7#
Path.GetTempFileName()将创建一个唯一命名的空文件并返回其路径。
如果您想要控制路径但获取随机文件名,则可以使用GetRandomFileName仅返回文件名字符串并将其用于Create
例如: