C # /. NET'te boş bir dosya oluşturmanın en basit / standart yolu nedir?
Şimdiye kadar bulabildiğim en basit yol:
System.IO.File.WriteAllLines(filename, new string[0]);
C # /. NET'te boş bir dosya oluşturmanın en basit / standart yolu nedir?
Şimdiye kadar bulabildiğim en basit yol:
System.IO.File.WriteAllLines(filename, new string[0]);
Yanıtlar:
Sadece kullanmak File.Createdosyayı açık bırakacaktır, bu muhtemelen istediğiniz şey değildir.
Kullanabilirsin:
using (File.Create(filename)) ;
Biraz tuhaf görünüyor, dikkat et. Bunun yerine kaşlı ayraç kullanabilirsiniz:
using (File.Create(filename)) {}
Veya Disposedoğrudan arayın :
File.Create(filename).Dispose();
Her iki durumda da, bunu birden fazla yerde kullanacaksanız, muhtemelen bir yardımcı yöntemle sarmayı düşünmelisiniz, örn.
public static void CreateEmptyFile(string filename)
{
File.Create(filename).Dispose();
}
DisposeBir usingifadeyi kullanmak yerine doğrudan çağırmanın , burada anlayabildiğim kadarıyla çok fazla bir fark yaratmadığını unutmayın - bir fark yaratabilmenin tek yolu , iş parçacığı ile çağrı arasında iptal File.Createedildiğidir Dispose. Bu yarış koşulu varsa, iş parçacığı yöntemin en sonunda iptal edildiğinde , değer döndürülmeden hemen önce sürümde de mevcut olduğundan şüpheleniyorum ...usingFile.Create
using (File.Create(filename)) ;, ama sadeliğini seviyorumFile.Create(filename).Dispose();
File.Create(filename).Dispose();yerine kullanıyorum .
Close()kaynakları da yayınlayacak. Close()sadece aramalar Dispose- bkz. github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
using (new FileStream(filename, FileMode.CreateNew)) { }
File.WriteAllText("path", String.Empty);
veya
File.CreateText("path").Close();
File.WriteAllText(string, string)kullandığı "UTF-8 kodlamasını bir bayt sırası Mark olmadan (BOM)" . Hala bir tane görürseniz, bu WriteAllText veya raporlamaya değer dokümantasyonunda bir hata olacaktır.
Encoding.UTF8Bayt Sırası İşareti'ni (BOM) çıkaran bir kodlayıcı döndürür. new UTF8Encoding(false)Malzeme Listesinin çıktısını almayan bir UTF8 kodlayıcı almak için kullanabilirsiniz .
WriteAllText.NET'in önceki sürümünde gerçekten farklı davranıp davranmadığını bilmiyorum . Ancak, daha fazla emin olmak için kodlama bölümünü atlayın ve File.WriteAllBytes(path, new byte[] { });bunun yerine kullanın.
System.IO.File.Create(@"C:\Temp.txt");
Diğerlerinin de belirttiği gibi, bu nesneyi atmalı veya boş bir ifade kullanarak sarmalısınız.
using (System.IO.File.Create(@"C:\Temp.txt"));
Yanlışlıkla mevcut bir dosyanın üzerine yazılmasını önlemek için:
using (new FileStream(filename, FileMode.CreateNew)) {}
... ve dosya zaten mevcutsa oluşacak IOException kuralını işleyin.
File.Creatediğer yanıtlarda önerilen dosya zaten varsa dosyanın içeriğinin üzerine yazacaktır. Basit durumlarda bunu kullanarak hafifletebilirsiniz File.Exists(). Ancak, birden çok iş parçacığının ve / veya işlemin aynı klasörde aynı anda dosya oluşturmaya çalıştığı senaryolarda daha sağlam bir şey gereklidir.
Boş bir dosya oluşturmak için biraz yaygın bir kullanım durumu, süreç iletişiminde daha sofistike olmadığında farklı bir süreçte başka bir şeyi tetiklemektir. Bu durumda, dosya oluşturma işleminin dış dünyanın bakış açısından atomik olmasına yardımcı olabilir (özellikle tetiklenen şey, tetikleyiciyi "tüketmek" için dosyayı silecekse).
Bu nedenle, oluşturmak istediğiniz dosyayla aynı dizinde önemsiz bir ad (Guid.NewGuid.ToString ()) oluşturmaya ve ardından geçici addan istediğiniz ada bir File.Move işlemi yapmaya yardımcı olabilir. Aksi takdirde, dosyanın varlığını kontrol eden ve daha sonra tetiği silen tetiklenmiş kod, dosyanın tamamen kapatılmadan önce silindiği yarış koşullarına girebilir.
Temp dosyasının aynı dizinde (ve dosya sisteminde) bulunması, size istediğiniz atomisiteyi verir. Bu gibi bir şey verir.
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 () benzersiz bir şekilde adlandırılmış boş bir dosya oluşturur ve yolu geri döndürür.
Yolu kontrol etmek, ancak rastgele bir dosya adı almak istiyorsanız, GetRandomFileName'i kullanarak bir dosya adı dizesi döndürüp Create ile kullanabilirsiniz.
Örneğin:
string fileName=Path.GetRandomFileName();
File.Create("custom\\path\\" + fileName);