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.

Diskdrive
sumber
1
Kemungkinan rangkap dari Jika folder tidak ada, buatlah
Michael Freidgeim
@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);
Mengenakan
sumber
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
107

Anda dapat menggunakan kode berikut

  DirectoryInfo di = Directory.CreateDirectory(path);
Ram
sumber
41
Directory.CreateDirectorytidak persis apa yang Anda inginkan: Ini menciptakan direktori jika belum ada. Tidak perlu melakukan pemeriksaan eksplisit terlebih dahulu .
Paolo Moretti
13
Melempar IOException jika pathfile dan bukan direktori. msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
scaryman
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))

willvv
sumber
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 .

MiguelSlv
sumber
-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 .

hitec
sumber
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();

Godwin Awojobi
sumber