Qual è il modo più semplice / canonico per creare un file vuoto in C # /. NET?
Il modo più semplice che ho trovato finora è:
System.IO.File.WriteAllLines(filename, new string[0]);
Qual è il modo più semplice / canonico per creare un file vuoto in C # /. NET?
Il modo più semplice che ho trovato finora è:
System.IO.File.WriteAllLines(filename, new string[0]);
Risposte:
L'uso di just File.Createlascerà il file aperto, che probabilmente non è quello che vuoi.
Puoi usare:
using (File.Create(filename)) ;
Sembra un po 'strano, intendiamoci. È possibile utilizzare invece le parentesi graffe:
using (File.Create(filename)) {}
Oppure chiama Disposedirettamente:
File.Create(filename).Dispose();
Ad ogni modo, se hai intenzione di usarlo in più di un posto dovresti probabilmente considerare di avvolgerlo in un metodo di supporto, ad es.
public static void CreateEmptyFile(string filename)
{
File.Create(filename).Dispose();
}
Nota che chiamare Disposedirettamente invece di usare usingun'istruzione non fa davvero molta differenza qui per quanto posso dire - l'unico modo in cui potrebbe fare la differenza è se il thread fosse interrotto tra la chiamata a File.Createe la chiamata a Dispose. Se esiste quella condizione di gara, sospetto che esisterebbe anche nella usingversione, se il thread fosse interrotto alla fine del File.Createmetodo, appena prima che il valore fosse restituito ...
using (File.Create(filename)) ;, ma adoro la semplicità diFile.Create(filename).Dispose();
File.Create(filename).Dispose();invece di.
Close()rilascerà anche le risorse. Close()chiama solo Dispose- vedi github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
o
File.CreateText("path").Close();
File.WriteAllText(string, string)utilizza "codifica UTF-8 senza un Byte-Order Mark (BOM)" . Se ne vedi ancora uno, sarebbe un bug in WriteAllText o nella sua documentazione che vale la pena segnalare.
Encoding.UTF8restituisce un codificatore che emette il Byte Order Mark (BOM). È possibile utilizzare new UTF8Encoding(false)per ottenere un codificatore UTF8 che non genera la DBA.
WriteAllTextsi comporta davvero diversamente nella versione precedente di .NET. Tuttavia, per essere più sicuro, basta saltare la parte di codifica e utilizzare File.WriteAllBytes(path, new byte[] { });invece.
System.IO.File.Create(@"C:\Temp.txt");
Come altri hanno sottolineato, è necessario disporre di questo oggetto o avvolgerlo in un'istruzione using vuota.
using (System.IO.File.Create(@"C:\Temp.txt"));
Per evitare la sovrascrittura accidentale di un file esistente utilizzare:
using (new FileStream(filename, FileMode.CreateNew)) {}
... e gestire IOException che si verificherà se il file esiste già.
File.Create, suggerito in altre risposte, sovrascriverà il contenuto del file se esiste già. In casi semplici puoi mitigarlo usando File.Exists(). Tuttavia, è necessario qualcosa di più robusto negli scenari in cui più thread e / o processi stanno tentando di creare file nella stessa cartella contemporaneamente.
Un caso d'uso piuttosto comune per la creazione di un file vuoto è innescare qualcos'altro che accade in un processo diverso in assenza di una comunicazione di processo più sofisticata. In questo caso, può essere utile che la creazione del file sia atomica dal punto di vista del mondo esterno (in particolare se la cosa che viene attivata eliminerà il file per "consumare" il trigger).
Quindi può aiutare a creare un nome indesiderato (Guid.NewGuid.ToString ()) nella stessa directory del file che si desidera creare, quindi fare un File. Passare dal nome temporaneo al nome desiderato. In caso contrario, il codice attivato che verifica l'esistenza del file e quindi elimina il trigger potrebbe incorrere in condizioni di competizione in cui il file viene eliminato prima che sia completamente chiuso.
Avere il file temporaneo nella stessa directory (e file system) ti dà l'atomicità che potresti desiderare. Questo dà qualcosa di simile.
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 () creerà un file vuoto con nome univoco e vi restituirà il percorso.
Se si desidera controllare il percorso ma ottenere un nome file casuale, è possibile utilizzare GetRandomFileName per restituire una stringa di nome file e utilizzarla con Crea
Per esempio:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);