Bir dosya oluşturmak için yoksa nasıl dizin oluştururum?


203

Dizin yoksa burada kırılan bir kod parçası var:

System.IO.File.WriteAllText(filePath, content);

Bir satırda (veya birkaç satırda), yeni dosyaya giden dizinin bulunup bulunmadığını kontrol etmek ve yoksa yeni dosyayı oluşturmadan önce oluşturmak mümkün müdür?

.NET 3.5 kullanıyorum.



@TimSchmelter, "Muhtemel çift", temizlemenin bir yoludur - benzer soruları kapatmak ve en iyi yanıtları tutmak. Tarih önemli değil. Bkz. Meta.stackexchange.com/questions/147643/… Açıklama yapılması gerektiğini kabul ediyorsanız lütfen meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Yanıtlar:


395

Yaratmak

(new FileInfo(filePath)).Directory.Create() Dosyaya yazmadan önce.

.... Veya Varsa, yaratın (başka bir şey yapmayın)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);

5
İç içe klasörlerin oluşturulmasını gerektiren durumları ele aldığı için zarif çözüm.
Denny Jacob

Teşekkür ederim! Stackoverflow.com/questions/9065598'i gördüm , ancak bir dosyanın mutlak yoluyla başlamak istedim ve yolu bölmekle uğraşmak istemedim. Artık Directory'ye FileInfo örneğinden erişebileceğinizi biliyorum.
Johann

Bunu yapmanın zaman uyumsuz bir yolu var mı?
Joe Phillips

1
Sanırım bunu yapabilirsin Task.Run(() => );.
Don


34

@Hitec'in dediği gibi, doğru izinlere sahip olduğunuzdan emin olmalısınız, eğer yaparsanız, dizinin varlığını sağlamak için bu satırı kullanabilirsiniz:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

Dosyanızı var olmayan bir dizine taşımanın zarif bir yolu, yerel FileInfo sınıfına aşağıdaki uzantıyı oluşturmaktır:

public static class FileInfoExtension
{
    //second parameter is need to avoid collision with native MoveTo
    public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 

        if (autoCreateDirectory)
        {
            var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));

            if (!destinationDirectory.Exists)
                destinationDirectory.Create();
        }

        file.MoveTo(destination);
    }
}

Ardından yepyeni MoveTo uzantısını kullanın:

 using <namespace of FileInfoExtension>;
 ...
 new FileInfo("some path")
     .MoveTo("target path",true);

Yöntemler uzantısı belgelerini kontrol edin .


-1

Sen kullanabilirsiniz File.exists dosyanın varlığının kontrol ve kullanarak oluşturun File.Create gerekirse. Bu konumda dosya oluşturma erişiminizin olup olmadığını kontrol ettiğinizden emin olun.

Dosyanın var olduğundan emin olduktan sonra, güvenli bir şekilde yazabilirsiniz. Bir önlem olarak, kodunuzu bir deneyin ... catch bloğuna koymalı ve işler tam olarak planlandığı gibi gitmezse fonksiyonun artacağı istisnaları yakalamalısınız.

Temel dosya G / Ç kavramları için ek bilgiler .


Başlangıçta var olmayan bir dosyaya yazmak istediğiniz sorunuzu yanlış okudum. Kavramlar aslında Dosya ve Dizin IO için aynıdır.
hitec

-2

var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

var file = new FileInfo(filePath);

file.Directory.Create(); Dizin zaten varsa, bu yöntem hiçbir şey yapmaz.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

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.