Bagaimana cara membuat direktori jika tidak ada untuk membuat file?


202

Saya memiliki sepotong kode di sini yang rusak jika direktori tidak ada:

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

Dalam satu baris (atau beberapa baris), apakah mungkin untuk memeriksa apakah direktori yang mengarah ke file baru tidak ada dan jika tidak, untuk membuatnya sebelum membuat file baru?

Saya menggunakan .NET 3.5.



@TimSchmelter, "Kemungkinan duplikat" adalah cara untuk membersihkan - untuk menutup pertanyaan serupa dan menyimpannya dengan jawaban terbaik. Tanggal tidak penting. Lihat meta.stackexchange.com/questions/147643/... Jika Anda setuju bahwa itu memerlukan klarifikasi, silakan pilih meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Jawaban:


394

Untuk membuat

(new FileInfo(filePath)).Directory.Create() Sebelum menulis ke file.

.... Atau, Jika ada, maka buat (jika tidak, jangan lakukan apa pun)

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
Solusi elegan karena menangani situasi yang membutuhkan pembuatan folder bersarang.
Denny Jacob

Terima kasih! Saya melihat stackoverflow.com/questions/9065598 , tapi saya ingin memulai dengan path absolut ke file, dan tidak ingin berurusan dengan pemisahan path. Sekarang saya tahu bahwa Anda dapat mengakses Direktori dari instance FileInfo.
Johann

Apakah ada cara async untuk melakukan ini?
Joe Phillips

1
Saya kira Anda bisa melakukannya dengan Task.Run(() => );.
Don


34

Seperti yang dikatakan @hitec, Anda harus yakin bahwa Anda memiliki izin yang tepat, jika Anda melakukannya, Anda dapat menggunakan baris ini untuk memastikan keberadaan direktori:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

Cara yang elegan untuk memindahkan file Anda ke direktori yang tidak ada adalah dengan membuat ekstensi berikut ke kelas FileInfo asli:

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

Kemudian gunakan ekstensi MoveTo baru:

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

Periksa Metode dokumentasi ekstensi .


-1

Anda dapat menggunakan File.Exists untuk memeriksa apakah file tersebut ada dan membuatnya menggunakan File.Create jika diperlukan. Pastikan Anda memeriksa apakah Anda memiliki akses untuk membuat file di lokasi itu.

Setelah yakin file itu ada, Anda dapat menulis dengan aman. Meskipun sebagai tindakan pencegahan, Anda harus memasukkan kode Anda ke dalam percobaan ... tangkap blok dan tangkap untuk pengecualian yang kemungkinan fungsi akan naik jika semuanya tidak berjalan persis seperti yang direncanakan.

Informasi tambahan untuk konsep I / O file dasar .


Saya awalnya salah membaca pertanyaan Anda bahwa Anda ingin menulis ke file yang mungkin tidak ada. Konsep dasarnya sama untuk File dan Direktori IO.
hitec

-2

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

var file = new FileInfo(filePath);

file.Directory.Create(); Jika direktori sudah ada, metode ini tidak melakukan apa-apa.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.