Answers:
使用just 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();
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();
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"));
创建空文件的一种常见用法是在缺少更复杂的过程通信的情况下触发其他过程中发生的其他事情。在这种情况下,从外部世界的角度来看,使文件创建成为原子是有帮助的(特别是如果要触发的事物将要删除文件以“使用”触发器)。
因此,它可以帮助在要创建的文件所在的目录中创建垃圾名称(Guid.NewGuid.ToString()),然后执行File.Move从临时名称更改为所需的名称。否则,检查文件存在然后删除触发器的触发代码可能会陷入竞争状态,在这种情况下,文件被完全关闭之前已被删除。
将temp文件放在相同的目录(和文件系统)中可为您提供所需的原子性。这给像。
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);