Klasörler yoksa nasıl dosya VE herhangi bir klasör oluşturabilirim?


136

Aşağıdaki dosyayı oluşturmak (veya üzerine yazmak) istediğinizi düşünün: - C:\Temp\Bar\Foo\Test.txt

Kullanılması File.Create (..) yöntemini bu bunu yapabilir.

AMA, aşağıdaki klasörlerden birine sahip değilseniz (yukarıdaki örnek yoldan)

  • Sıcaklık
  • Bar
  • foo

sonra atılan bir DirectoryNotFoundException olsun .

Yani .. Bir yol verilen, nasıl yinelemeli bu yol için dosya oluşturmak için gerekli tüm klasörler .. oluşturabilirim? Temp veya Bar klasörleri var, ancak Foo yok ... ise bu da oluşturulur.

Basitlik açısından, Güvenlikle ilgili herhangi bir endişe olmadığını varsayalım - tüm izinler iyi, vb.



Yanıtlar:


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

Bu MSDN sayfasına bakın .

Umut etmek bu yardım etmek!


82
Önce çek Directory.CreateDirectoryolmadan körü körüne çağırabilirsiniz Directory.Exists- dizin zaten oradaysa atmaz.
Tim Robinson

1
@Tim: Emin değildim bu yüzden onu oraya attım. Yine de bilgi için teşekkürler.
Christopher B. Adkins

24
Path.GetDirectoryName(string path)Dizini tam yolunuzdan almayı unutmayın
Oliver

@Oliver: Directory ve DirectoryInfo sınıflarıyla birlikte gelen bir sürü işlevsellik var, ancak verdiğim kod ona doğru yönde itmek için yeterliydi. Bence bağlantı da biraz genişliyor.
Christopher B. Adkins

8
* NOT: değişken pathdosya adını içermemelidir. Bu yüzden OP'nin örneğini kullanmak pathgerekir C:\Temp\Bar\Foo. Arama yaptıktan sonra dosyayı oluşturmak için Directory.CreateDirectory(path);yine de aramanız gerekir File.Create("C:\Temp\Bar\Foo\Test.txt");.
sazr

139

Diğer cevaplarda neler yorumlandığını özetlemek için:

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

Directory.CreateDirectory dizinleri özyinelemeli olarak oluşturur ve dizin zaten varsa, hatasız olarak geri döner.

Olacaksa olduysa bir dosya Fooolarak C:\Temp\Bar\Fooistisna atılmış olacaktır.


Uzun yolla (256+) uğraşıyorsanız bkz. Stackoverflow.com/questions/5188527/…
Alexei Levenkov


3

. bir yol verildiğinde, dosyayı oluşturmak için gerekli tüm klasörleri özyinelemeli olarak nasıl oluşturabiliriz.

Yol tarafından belirtilen tüm dizinleri ve alt dizinleri oluşturur.

Directory.CreateDirectory(path);

bir dosya oluşturabilirsiniz.


2
dosya adı olmayan yol :)
Sameera R.

1
"tüm dizinler ve alt dizinler" Hatalı: en fazla bir dizin ve gerekli tüm alt dizinleri oluşturur.
Camilo Terevinto 17.06.2016

3

Yolun her iki bölümünü de (dizin ve dosya adı) kontrol etmeniz ve yoksa her birini oluşturmanız gerekir.

Var olup olmadığını öğrenmek için File.Existsve tuşlarını kullanın Directory.Exists. Directory.CreateDirectorysizin için tüm yolu oluşturacaktır, bu yüzden dizin yoksa yalnızca bir kez çağırmanız yeterlidir, sonra dosyayı oluşturun.


Directory.CreateDirectory için hangi bölümün var olduğunu görmenize gerek yoktur. Gerekli tüm dizinleri oluşturacaktır (hedeflenen dizinin zaten mevcut olmadığından emin olmak için tek şey).
Gertjan

Bu durumda ilk satırınızı kaldırmanızı öneririm, çünkü her bir parçayı kökten kontrol etmesi gerekmez, sadece tam yolu kontrol edin ve yoksa oluşturun.
Gertjan

@Gertjan - cevap güncellendi ... umarım şimdi standartlarınızı karşılar;)
Oded

:) öyle :) (yanlış olduğunu kanıtlamak veya sizi rahatsız etmek benim amacım değildi, ama yeni başlayanlar cevaplarda herhangi bir açıklama kullanabilir)
Gertjan


0

Directory.CreateDirectory () istiyorsunuz

Bir kaynak dizin ve bir hedef iletirseniz, o dizinin tüm dosya ve alt klasörlerini hedefinize kopyalayacağımı (C # 'a dönüştürülür) kullandığım bir sınıf:

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

}

}


2
Bu satır nedeniyle bu sürüm düşürmek gerekir: using Microsoft.VisualBasic;Evil !!
Pure.Krome

2
Ve neden Microsoft.VisualBasic kötülük ?? Bu .Net Framework'teki herkes gibi bir derleme.
Oliver

2
Sanırım gereksiz yere başka bir dilin ad alanını içe aktardığınız için ..?
Markive

0

Derleme / exe dosyasında FileIO izni olduğunu varsayarsak, doğru değil. Uygulamanız yönetici haklarıyla çalışmayabilir. Onun önemli düşünmeye kod erişimi güvenliği ve talep eden izinleri örnek kod:

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

.NET Kod Erişim Güvenliğini Anlama

“Kod Erişim Güvenliği” herhangi bir gerçek dünyada kullanılıyor mu?


1
@ Pure.Krome: Cevabım hedef dışında olsa da, ayrıcalıklı kaynağa erişirken güvenlik ve erişim kontrolünü düşünün. Asla sorunuzun üstesinden gelmek ya da karmaşıklaştırmak istemedim :)
PRR

0

Burada başka cevaplar olduğunu biliyorum, ama hiçbiri yeterince tam değil, aşağıdaki kod dizinleri (yoksa) oluşturur ve sonra dosyaları kopyalar .

// 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"));
        }
    }
}
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.