Bagaimana cara membuat file DAN folder apa pun, jika folder tersebut tidak ada?

140

Bayangkan saya ingin membuat (atau menimpa) file berikut: - C:\Temp\Bar\Foo\Test.txt

Dengan menggunakan metode File.Create (..) , ini bisa melakukannya.

TAPI, jika saya tidak memiliki salah satu folder berikut (dari jalur contoh itu, di atas)

  • Temp
  • Batang
  • Foo

lalu saya mendapatkan DirectoryNotFoundException muncul .

Jadi .. diberi jalur, bagaimana kita bisa secara rekursif membuat semua folder yang diperlukan untuk membuat file .. untuk jalur itu? Jika folder Temp atau Bar ada, tetapi Foo tidak ... maka itu juga dibuat.

Untuk kesederhanaan, anggap saja tidak ada masalah Keamanan - semua izin baik-baik saja, dll.

Pure.Krome
sumber
1
kemungkinan duplikat untuk menyimpan file dan secara otomatis membuat direktori
mateuscb
Kemungkinan duplikat dari Jika folder tidak ada, buatlah
Michael Freidgeim

Jawaban:

126
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
    Directory.GetCreationTime(path));

Lihat halaman MSDN ini .

Semoga itu bisa membantu!

Christopher B. Adkins
sumber
82
Anda dapat memanggil secara membabi buta Directory.CreateDirectorytanpa Directory.Existspemeriksaan terlebih dahulu - ini tidak akan muncul jika direktori sudah ada.
Tim Robinson
1
@ Tim: Tidak yakin jadi saya lemparkan ke sana siapa saja. Terima kasih atas infonya.
Christopher B. Adkins
24
Dan jangan lupa Path.GetDirectoryName(string path)untuk mendapatkan direktori dari jalur lengkap Anda
Oliver
@Oliver: Ada banyak sekali fungsionalitas yang sejalan dengan kelas Directory dan DirectoryInfo, tetapi kode yang saya berikan sudah cukup untuk memberinya dorongan ke arah yang benar. Saya pikir tautannya juga sedikit meluas.
Christopher B. Adkins
9
* CATATAN: variabel pathtidak boleh berisi nama file. Jadi menggunakan contoh OP pathseharusnya C:\Temp\Bar\Foo. Setelah menelepon Directory.CreateDirectory(path);Anda masih perlu menelepon File.Create("C:\Temp\Bar\Foo\Test.txt");untuk membuat file.
sazr
146

Untuk meringkas apa yang telah dikomentari dalam jawaban lain:

//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));

Directory.CreateDirectory akan membuat direktori secara rekursif dan jika direktori sudah ada maka akan kembali tanpa kesalahan.

Jika kebetulan ada file Foodi C:\Temp\Bar\Foopengecualian akan dilempar.

hultqvist
sumber
Jika Anda berurusan dengan jalur panjang (256+) lihat stackoverflow.com/questions/5188527/…
Alexei Levenkov
4

. diberi jalan, bagaimana kita bisa secara rekursif membuat semua folder yang diperlukan untuk membuat file .. untuk jalur itu

Membuat semua direktori dan subdirektori seperti yang ditentukan oleh jalur.

Directory.CreateDirectory(path);

maka Anda dapat membuat file.

Arseny
sumber
2
jalur tanpa nama file :)
Sameera R.
1
"semua direktori dan subdirektori" Salah: ini akan membuat, paling banyak, satu direktori dan semua subdirektori yang diperlukan.
Camilo Terevinto
4

Anda perlu memeriksa kedua bagian jalur (direktori dan nama file) dan membuatnya masing-masing jika tidak ada.

Gunakan File.Existsdan Directory.Existsuntuk mencari tahu apakah mereka ada. Directory.CreateDirectoryakan membuat seluruh jalur untuk Anda, jadi Anda hanya perlu memanggilnya sekali jika direktori tidak ada, maka cukup buat file.

Oded
sumber
Untuk Directory.CreateDirectory Anda tidak perlu melihat bagian mana yang ada. Ini akan membuat semua direktori yang diperlukan (hanya untuk memastikan bahwa direktori yang ditargetkan belum ada).
Gertjan
Saya sarankan untuk menghapus baris pertama jawaban Anda dalam kasus itu karena dia tidak perlu memeriksa setiap bagian dari root, cukup periksa jalur lengkap dan buat jika tidak ada.
Gertjan
@Gertjan - jawaban diperbarui ... semoga memenuhi standar Anda sekarang;)
Oded
:) itu benar :) (bukan maksud saya untuk membuktikan Anda salah atau menyinggung Anda, tetapi pemula dapat menggunakan klarifikasi apa pun dalam jawaban)
Gertjan
0

Anda ingin Directory.CreateDirectory ()

Berikut adalah kelas yang saya gunakan (dikonversi ke C #) yang jika Anda meneruskannya ke direktori sumber dan tujuan itu akan menyalin semua file dan sub-folder dari direktori itu ke tujuan Anda:

using System.IO;

public class copyTemplateFiles
{


public static bool Copy(string Source, string destination)
{

    try {

        string[] Files = null;

        if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
            destination += Path.DirectorySeparatorChar;
        }

        if (!Directory.Exists(destination)) {
            Directory.CreateDirectory(destination);
        }

        Files = Directory.GetFileSystemEntries(Source);
        foreach (string Element in Files) {
            // Sub directories
            if (Directory.Exists(Element)) {
                copyDirectory(Element, destination + Path.GetFileName(Element));
            } else {
                // Files in directory
                File.Copy(Element, destination + Path.GetFileName(Element), true);
            }
        }

    } catch (Exception ex) {
        return false;
    }

    return true;

}



private static void copyDirectory(string Source, string destination)
{
    string[] Files = null;

    if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
        destination += Path.DirectorySeparatorChar;
    }

    if (!Directory.Exists(destination)) {
        Directory.CreateDirectory(destination);
    }

    Files = Directory.GetFileSystemEntries(Source);
    foreach (string Element in Files) {
        // Sub directories
        if (Directory.Exists(Element)) {
            copyDirectory(Element, destination + Path.GetFileName(Element));
        } else {
            // Files in directory
            File.Copy(Element, destination + Path.GetFileName(Element), true);
        }
    }

}

}

Markif
sumber
2
Saya harus menurunkan ini karena baris ini: using Microsoft.VisualBasic;Jahat !!
Pure.Krome
2
Dan mengapa Microsoft.VisualBasic jahat ?? Ini adalah rakitan seperti orang lain di .Net Framework.
Oliver
2
Saya kira karena Anda tidak perlu mengimpor namespace dari seluruh bahasa lain ..?
Markif
0

Menganggap bahwa assembly / exe Anda memiliki izin FileIO itu sendiri, itu tidak benar. Aplikasi Anda mungkin tidak berjalan dengan hak admin. Penting untuk mempertimbangkan Keamanan Akses Kode dan meminta izin. Contoh kode:

FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, "C:\\test_r");
f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C:\\example\\out.txt");
try
{
    f2.Demand();
}
catch (SecurityException s)
{
    Console.WriteLine(s.Message);
}

Memahami Keamanan Akses Kode .NET

Apakah "Keamanan Akses Kode" digunakan di dunia nyata?

PRR
sumber
1
@ Pure.Krome: Meskipun jawaban saya tidak sesuai target, tetap pertimbangkan keamanan dan kontrol akses saat mengakses sumber yang memiliki hak istimewa. Tidak pernah bermaksud untuk menyalip atau memperumit pertanyaan Anda :)
PRR
0

Saya tahu ada beberapa jawaban lain di sini, tetapi tidak ada yang tidak cukup lengkap, kode berikut akan membuat direktori (jika tidak ada) & kemudian menyalin file .

// using System.IO;

// for ex. if you want to copy files from D:\A\ to D:\B\
foreach (var f in Directory.GetFiles(@"D:\A\", "*.*", SearchOption.AllDirectories))
{
    var fi =  new FileInfo(f);
    var di = new DirectoryInfo(fi.DirectoryName);

    // you can filter files here
    if (fi.Name.Contains("FILTER")
    {
        if (!Directory.Exists(di.FullName.Replace("A", "B"))
        {                       
            Directory.CreateDirectory(di.FullName.Replace("A", "B"));           
            File.Copy(fi.FullName, fi.FullName.Replace("A", "B"));
        }
    }
}
Mehdi Dehghani
sumber