2009-04-29 114 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()來緩解這種情況。然而,在多線程和/或進程試圖同時在同一文件夾中創建文件的情況下,更強大的功能是必需的。