2009-04-29 118 views

回答

315

只需使用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方法的最后中止,被返回的值之前...

+6

有趣。我在5分钟前写了相同的代码。我做了File.Create(filename).Close();同样的差异... – 2009-04-29 14:43:04

+2

我的代码使用'使用(File.Create(文件名));',但我喜欢'File.Create(文件名).Dispose();' – Vadim 2013-04-29 16:17:27

+0

@BrianGenisio简单:我只是做了大约5分钟前也有相同的代码!我只是去看看其他程序员是如何做到的。现在我正在使用'File.Create(filename).Dispose();'而不是。 – Jack 2015-03-22 18:31:06

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

正如其他人所指出的那样,你应该处理这个对象,或者在空using语句包裹。

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

会不会更好地处理对象? 例如: 使用(System.IO.File.Create(filepath)){} – kentaromiura 2009-04-29 14:21:52

+0

@kentaromiura:我的想法,因此我的答案:) – 2009-04-29 14:23:29

+0

好点的家伙。将更新orig。干杯。 – 2009-04-29 14:32:25

27
File.WriteAllText("path", String.Empty); 

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

使用第一个,这个文件是3个字节长:编码代码,第二个文件使用的是0字节(真的是空的)。 – Fil 2015-05-27 21:03:45

+1

@Fil:你确定吗?文档说](https://msdn.microsoft.com/en-us/library/ms143375.aspx)'File.WriteAllText(string,string)'使用*“UTF-8编码**没有字节顺序Mark **(BOM)“*。如果你仍然看到一个,这将是WriteAllText中的一个错误或其文档值得报告 – Heinzi 2017-03-07 14:09:37

+0

我记得我已经尝试过了,也许这是以前.Net版本的一个旧bug?如果我明确指定使用UTF8编码(或unicode或其他): Fil 2017-03-08 14:54:23

0

Path.GetTempFileName()将创建一个名为uniquly空文件和路径返回。

如果你想控制的路径,但获得一个随机的文件名可以使用GetRandomFileName只返回一个文件名字符串,并使用它创建

例如:

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

恕我直言GetTempFileName()是完全错误的。 – 2009-04-29 14:26:50

+0

为什么这个答案没有帮助? – Crippledsmurf 2009-04-30 20:39:00

+0

由于两个原因,这没有任何帮助:1.该问题没有询问有关生成随机文件名的任何内容,因此这是一种分心。 2.文件没有关闭,这意味着如果以后尝试打开另一个文件编写器或移动该文件,它将失败。 – 2015-12-08 04:59:52

3

你可以连续使用方法关闭返回的对象,这样您就可以立即关闭刚刚在单个语句中打开的文件。

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

一个有点常见用例创建一个空文件是触发别的东西在进程间通信缺乏更精密的在不同的过程中发生。在这种情况下,它可以帮助从外部世界的角度来创建文件(特别是在被触发的事件将删除文件以“消耗”触发器时)。

因此,它可以帮助创建一个垃圾名称(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); 
} 
1

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

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

...和处理,如果该文件已经存在,将发生IOException异常。

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