Jaki jest najprostszy / kanoniczny sposób utworzenia pustego pliku w C # / .NET?
Najprostszym sposobem, jaki udało mi się znaleźć do tej pory, jest:
System.IO.File.WriteAllLines(filename, new string[0]);
Jaki jest najprostszy / kanoniczny sposób utworzenia pustego pliku w C # / .NET?
Najprostszym sposobem, jaki udało mi się znaleźć do tej pory, jest:
System.IO.File.WriteAllLines(filename, new string[0]);
Odpowiedzi:
Użycie just File.Createpozostawi plik otwarty, co prawdopodobnie nie jest tym, czego chcesz.
Możesz użyć:
using (File.Create(filename)) ;
To trochę dziwne, pamiętaj. Zamiast tego możesz użyć nawiasów klamrowych:
using (File.Create(filename)) {}
Lub po prostu zadzwoń Disposebezpośrednio:
File.Create(filename).Dispose();
Tak czy inaczej, jeśli zamierzasz użyć tego w więcej niż jednym miejscu, prawdopodobnie powinieneś rozważyć zapakowanie go w metodę pomocniczą, np.
public static void CreateEmptyFile(string filename)
{
File.Create(filename).Dispose();
}
Należy pamiętać, że dzwoniąc Disposebezpośrednio zamiast używać usingoświadczenie naprawdę nie robi dużej różnicy tutaj o ile mogę powiedzieć - tylko w ten sposób, że mógł dokonać różnica jest jeśli wątek zostały przerwane między wywołaniu File.Createi wywołaniu Dispose. Jeśli ten warunek wyścigu istnieje, podejrzewam, że istniałby również w usingwersji, gdyby wątek został przerwany na samym końcu File.Createmetody, tuż przed zwróceniem wartości ...
using (File.Create(filename)) ;, ale uwielbiam prostotęFile.Create(filename).Dispose();
File.Create(filename).Dispose();zamiast.
Close()zwolni również zasoby. Close()tylko połączenia Dispose- patrz github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
lub
File.CreateText("path").Close();
File.WriteAllText(string, string)używa „kodowania UTF-8 bez znaku Byte-Order Mark (BOM)” . Jeśli nadal go widzisz, byłby to błąd w WriteAllText lub jego dokumentacji, którą warto zgłosić.
Encoding.UTF8zwraca koder, który wyprowadza znak Byte Order Mark (BOM). Możesz użyć, new UTF8Encoding(false)aby uzyskać koder UTF8, który nie generuje BOM.
WriteAllTextnaprawdę zachowuje się inaczej w poprzedniej wersji .NET. Jednak dla większej pewności po prostu pomiń część kodującą i użyj File.WriteAllBytes(path, new byte[] { });zamiast tego.
System.IO.File.Create(@"C:\Temp.txt");
Jak zauważyli inni, powinieneś pozbyć się tego obiektu lub zawinąć go w pustą instrukcję using.
using (System.IO.File.Create(@"C:\Temp.txt"));
Aby uniknąć przypadkowego zastąpienia istniejącego pliku, użyj:
using (new FileStream(filename, FileMode.CreateNew)) {}
... i obsłuż wyjątek IOException, który pojawi się, jeśli plik już istnieje.
File.Create, co jest sugerowane w innych odpowiedziach, zastąpi zawartość, jeśli plik już istnieje. W prostych przypadkach można to złagodzić za pomocą File.Exists(). Jednak coś bardziej niezawodnego jest konieczne w scenariuszach, w których wiele wątków i / lub procesów próbuje jednocześnie utworzyć pliki w tym samym folderze.
Nieco powszechnym przypadkiem użycia do utworzenia pustego pliku jest wywołanie czegoś innego w innym procesie przy braku bardziej wyrafinowanej komunikacji procesu. W takim przypadku pomocne może być tworzenie pliku bez użycia atomu z punktu widzenia świata zewnętrznego (szczególnie jeśli rzecz, która zostanie uruchomiona, usunie plik, aby „wykorzystać” wyzwalacz).
Może więc pomóc stworzyć niepotrzebną nazwę (Guid.NewGuid.ToString ()) w tym samym katalogu, co plik, który chcesz utworzyć, a następnie wykonać File.Move z nazwy tymczasowej na pożądaną nazwę. W przeciwnym razie kod uruchamiany, który sprawdza istnienie pliku, a następnie usuwa wyzwalacz, może uruchomić się w warunkach wyścigu, w których plik jest usuwany przed całkowitym zamknięciem.
Posiadanie pliku tymczasowego w tym samym katalogu (i systemie plików) zapewnia atomowość, jakiej możesz potrzebować. To daje coś takiego.
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 () utworzy pusty plik o unikalnej nazwie i zwróci do niego ścieżkę.
Jeśli chcesz kontrolować ścieżkę, ale chcesz uzyskać losową nazwę pliku, możesz użyć GetRandomFileName, aby po prostu zwrócić ciąg nazwy pliku i użyć go z opcją Utwórz
Na przykład:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);