C # ile boş bir dosya oluşturma


187

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:


385

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


8
Komik. Aynı kodu yaklaşık 5 dakika önce yazdım. File.Create (dosyaadı) .Close (); Same diff ...
Brian Genisio

2
Kodumu kullanıyordum using (File.Create(filename)) ;, ama sadeliğini seviyorumFile.Create(filename).Dispose();
Vadim

@BrianGenisio: Ben de aynı kodu yaklaşık 5 dakika önce yaptım! Diğer programcıların bunu nasıl yaptığını görmek için araştırdım. Şimdi File.Create(filename).Dispose();yerine kullanıyorum .
Jack

1
@ user3791372: Close()kaynakları da yayınlayacak. Close()sadece aramalar Dispose- bkz. github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
Jon Skeet

2
Dosya zaten varsa ve salt okunur değilse, dosya içeriğinin üzerine yazıldığı açık olmayabilir. Bundan kaçınmak içinusing (new FileStream(filename, FileMode.CreateNew)) { }
Phil Haselden

34
File.WriteAllText("path", String.Empty);

veya

File.CreateText("path").Close();

2
Birincisini kullanarak dosya 3 bayt uzunluğundadır: kodlama kodu. İkincisini kullanarak dosya 0 bayttır (gerçekten boş).
Fil

1
@Fil: Emin misin? Dokümantasyon diyor o 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.
Heinzi

Denediğimi hatırlıyorum. Belki önceki .Net sürümünde eski bir hataydı? UTF8 kodlamasını (veya unicode veya başka bir şey) kullanmayı açıkça belirtirsem dosya boş değil: <File.WriteAllText ("c: \ del.txt", String.Empty, System.Text.Encoding.UTF8);>
Fil

1
@Fil, 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 .
Daniel Crabtree

1
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.
Jürgen Steinblock

20
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"));

4
nesneyi daha iyi atmayacak mısın? örneğin: (System.IO.File.Create (
dosyayolu

@kentaromiura: Düşüncelerim tam, dolayısıyla cevabım :)
Jon Skeet

5

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.


4

Yöntemleri döndürülen nesneden zincirleyebilirsiniz, böylece yeni açtığınız dosyayı hemen tek bir ifadede kapatabilirsiniz.

File.Open("filename", FileMode.Create).Close();

2

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);
}

0

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);

IMHO GetTempFileName () tamamen yanlış adlandırılmıştır.
kay.herzam

Bu cevap neden tam olarak yardımcı olmuyor?
Crippledsmurf

5
İki nedenden dolayı yararsızdır: 1. Soru rastgele bir dosya adı oluşturma hakkında hiçbir şey sormuyor, bu yüzden dikkat dağıtıcı. 2. Dosya kapatılmaz, yani daha sonra başka bir dosya yazarını açmaya çalışırsanız veya dosyayı taşırsanız başarısız olur.
Satya Nehri

Puanını alıyorum ama: 1. Tüm dosyaların bir isme ihtiyacı var. Bu basitti. bir şey 2 ile çarpışması muhtemel olmayan bir almak için uygun bir yol. 2. Söz konusu kodun, daha sonra, dosyanın yönetimi daha sonra oluşturma kesinlikle bir parçası değildir, dosyaları oluşturmak hakkında sorulan soru, bu yüzden onu atladı basitlik uğruna ve cevabı soruya odaklı tutmak
Crippledsmurf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.