Was ist der einfachste / kanonischste Weg, um eine leere Datei in C # /. NET zu erstellen?
Der einfachste Weg, den ich bisher finden konnte, ist:
System.IO.File.WriteAllLines(filename, new string[0]);
Was ist der einfachste / kanonischste Weg, um eine leere Datei in C # /. NET zu erstellen?
Der einfachste Weg, den ich bisher finden konnte, ist:
System.IO.File.WriteAllLines(filename, new string[0]);
Antworten:
Mit just File.Create bleibt die Datei geöffnet, was wahrscheinlich nicht das ist, was Sie wollen.
Du könntest benutzen:
using (File.Create(filename)) ;
Das sieht etwas seltsam aus, wohlgemerkt. Sie könnten stattdessen geschweifte Klammern verwenden:
using (File.Create(filename)) {}
Oder rufen Sie einfach Disposedirekt an:
File.Create(filename).Dispose();
In beiden Fällen sollten Sie, wenn Sie dies an mehreren Stellen verwenden möchten, wahrscheinlich in Betracht ziehen, es in eine Hilfsmethode einzuschließen, z
public static void CreateEmptyFile(string filename)
{
File.Create(filename).Dispose();
}
Beachten Sie, dass Aufruf Disposedirekt anstelle der Verwendung eines usingnicht wirklich viel Unterschied macht hier so weit wie ich kann sagen Aussage - den einzigen Weg , es könnte einen Unterschied machen, wenn der Faden zwischen dem Aufruf abgebrochen wurde File.Createzu und der Anruf Dispose. Wenn diese Racebedingung vorliegt, würde sie vermutlich auch in der usingVersion vorhanden sein, wenn der Thread am Ende der File.CreateMethode abgebrochen würde , kurz bevor der Wert zurückgegeben wurde ...
using (File.Create(filename)) ;, aber ich liebe die Einfachheit vonFile.Create(filename).Dispose();
File.Create(filename).Dispose();statt.
Close()auch die Ressourcen frei. Close()ruft einfach an Dispose- siehe github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
oder
File.CreateText("path").Close();
File.WriteAllText(string, string)Verwendungen "UTF-8 - Codierung ohne Byte-Order Mark (BOM)" . Wenn Sie immer noch einen sehen, wäre dies ein Fehler in WriteAllText oder seiner Dokumentation, die es wert ist, gemeldet zu werden.
Encoding.UTF8gibt einen Encoder zurück, der das Byte Order Mark (BOM) ausgibt. Sie können new UTF8Encoding(false)einen UTF8-Encoder verwenden, der die Stückliste nicht ausgibt.
WriteAllTextmich in der vorherigen Version von .NET wirklich anders verhalte. Um ganz sicher zu gehen, überspringen Sie einfach den Codierungsteil und verwenden Sie ihn File.WriteAllBytes(path, new byte[] { });stattdessen.
System.IO.File.Create(@"C:\Temp.txt");
Wie andere bereits betont haben, sollten Sie dieses Objekt entsorgen oder in eine leere using-Anweisung einschließen.
using (System.IO.File.Create(@"C:\Temp.txt"));
Um ein versehentliches Überschreiben einer vorhandenen Datei zu vermeiden, verwenden Sie:
using (new FileStream(filename, FileMode.CreateNew)) {}
... und behandeln Sie die IOException, die auftritt, wenn die Datei bereits vorhanden ist.
File.Create, was in anderen Antworten vorgeschlagen wird, überschreibt den Inhalt von, wenn die Datei bereits vorhanden ist. In einfachen Fällen können Sie dies mit abmildern File.Exists(). In Szenarien, in denen mehrere Threads und / oder Prozesse gleichzeitig versuchen, Dateien im selben Ordner zu erstellen, ist jedoch etwas Robusteres erforderlich.
Ein etwas häufiger Anwendungsfall für das Erstellen einer leeren Datei besteht darin, etwas anderes in einem anderen Prozess auszulösen, wenn keine komplexere Prozesskommunikation vorhanden ist. In diesem Fall kann es hilfreich sein, die Dateierstellung aus Sicht der Außenwelt atomar zu gestalten (insbesondere, wenn das ausgelöste Objekt die Datei löscht, um den Trigger zu "verbrauchen").
Daher kann es hilfreich sein, einen Junk-Namen (Guid.NewGuid.ToString ()) im selben Verzeichnis wie die zu erstellende Datei zu erstellen und dann eine Datei zu erstellen. Verschieben Sie vom temporären Namen zum gewünschten Namen. Andernfalls kann ausgelöster Code, der das Vorhandensein einer Datei überprüft und dann den Auslöser löscht, unter Rennbedingungen ausgeführt werden, bei denen die Datei gelöscht wird, bevor sie vollständig geschlossen wird.
Wenn Sie die temporäre Datei im selben Verzeichnis (und Dateisystem) haben, erhalten Sie die gewünschte Atomizität. Das gibt so etwas wie.
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 () erstellt eine eindeutig benannte leere Datei und gibt den Pfad dorthin zurück.
Wenn Sie den Pfad steuern möchten, aber einen zufälligen Dateinamen erhalten möchten, können Sie GetRandomFileName verwenden, um einfach eine Dateinamenzeichenfolge zurückzugeben und diese mit Create zu verwenden
Beispielsweise:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);