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]);
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 Dispose
direkt 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 Dispose
direkt anstelle der Verwendung eines using
nicht 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.Create
zu und der Anruf Dispose
. Wenn diese Racebedingung vorliegt, würde sie vermutlich auch in der using
Version vorhanden sein, wenn der Thread am Ende der File.Create
Methode 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 anDispose
- siehe github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…using (new FileStream(filename, FileMode.CreateNew)) { }
oder
quelle
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.UTF8
gibt einen Encoder zurück, der das Byte Order Mark (BOM) ausgibt. Sie könnennew UTF8Encoding(false)
einen UTF8-Encoder verwenden, der die Stückliste nicht ausgibt.WriteAllText
mich in der vorherigen Version von .NET wirklich anders verhalte. Um ganz sicher zu gehen, überspringen Sie einfach den Codierungsteil und verwenden Sie ihnFile.WriteAllBytes(path, new byte[] { });
stattdessen.Wie andere bereits betont haben, sollten Sie dieses Objekt entsorgen oder in eine leere using-Anweisung einschließen.
quelle
Sie können Methoden aus dem zurückgegebenen Objekt verketten, sodass Sie die gerade geöffnete Datei sofort in einer einzelnen Anweisung schließen können.
quelle
Um ein versehentliches Überschreiben einer vorhandenen Datei zu vermeiden, verwenden Sie:
... 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 abmildernFile.Exists()
. In Szenarien, in denen mehrere Threads und / oder Prozesse gleichzeitig versuchen, Dateien im selben Ordner zu erstellen, ist jedoch etwas Robusteres erforderlich.quelle
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.
quelle
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:
quelle