Bir klasör yoksa oluşturun


720

Uygulamamda bir FileUploader denetimi kullanıyorum. Bir dosyayı belirtilen bir klasöre kaydetmek istiyorum. Şimdi, bu klasör yoksa, önce onu oluşturmak ve daha sonra dosyamı bu klasöre kaydetmek istiyorum. Klasör zaten varsa, dosyayı içine kaydedin.

Bunu nasıl yapabilirim?


@JoeBlow - Ha - hangi cevabın yanlış olduğunu belirtmiş olmalı - şimdi sayfa daha da kafa karıştırıcı. (O kabul cevabı değiştirmek veya yapmadı mı OMG?!) ;-)
Bartosz

Başka şeyler ararken buraya geldim, ama aynı hikayenin kendi versiyonuyla kaç kişinin birbiriyle çelişmek için savaştığı şaşırtıcı. Microsoft, .NET Framework ve MSDN'yi yazdı. Mono gibi diğer uygulayıcılar tarafından doğru davranışa uyulup uyulmadığı, MSDN'de açıklanan davranışın doğruluğu ile ilgili değildir. Oh, ve Mono da doğru olanı yapıyor, bu yüzden argüman nerede?
monkey0506

Yanıtlar:


1239

Diğerlerinin söylediği gibi, System.IO.Directory.CreateDirectory

Ancak, önce var olup olmadığını kontrol etmenize gerek yoktur. Gönderen docs

Zaten var olmadıkça veya yolun bir kısmı geçersiz olmadığı sürece, yolda belirtilen tüm dizinler oluşturulur. Dizin zaten varsa, bu yöntem yeni bir dizin oluşturmaz, ancak varolan dizin için bir DirectoryInfo nesnesi döndürür.



25
ve yine de microsoft kod örneği dizinin ilk olup olmadığını kontrol ederek kendisiyle çelişiyor ...
ecoe

1
Yani var olup olmadığını kontrol etmeliyiz? Tekrar CreateDirectory yöntemini kontrol edip tekrar kontrol edersek, iki kez kontrol yaparız ... ve AFAIK dosya sistemi işlemi pahalıdır
Giox

3
@Muflix böyle - bir dizinde "FILENAME" gibi bir dosya oluşturun ancak herhangi bir uzantı vermeyin. Sonra Directory.Exists ("FILENAME") çağırmayı deneyin, böyle bir dizin olmadığı için olması gerektiği gibi yanlış döndürür. Şimdi CreateDirectory ("FILENAME") olarak adlandırırsanız, bu adla zaten "bir şey" olduğu için olması gerektiği gibi sefil bir şekilde başarısız olur. Umarım mantıklıdır.
Otávio Décio

1
YANLIŞ! I Klasörün var olup olmadığını kontrol etmelisiniz. Sadece bu yöntemin ciddi bir sorunu olduğunu belirledim. Klasörün varlığını kontrol etmezseniz, özellikle bırakmadıkça Klasör tanıtıcısı sızar. Bu örneği milyonlarca klasörü işleyen bir uygulamada kullandık. Bu yöntem her çağrıldığında, uygulama dosya tanıtıcısını dizinde tuttu. Birkaç saat sonra Corporate Network NAS klasörlerde milyonlarca Dosya tanıtıcısı açıldı. Çek ücretsiz dahil etmek için güncelleme kolu
soddoff Baldrick

357

Http://forums.asp.net/p/1226236/2209871.aspx uyarınca aşağıdaki kodu kullanın :

string subPath ="ImagesPath"; // your code goes here

bool exists = System.IO.Directory.Exists(Server.MapPath(subPath));

if(!exists)
    System.IO.Directory.CreateDirectory(Server.MapPath(subPath));

41
Neden olmasın: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Dayan

159
Klasörün var olup olmadığını kontrol etmeye gerek yoktur. Kılavuzu dikkatle okuyun.
bazzilic

31
Kontrol etmek ve yaratmak atomik değildir. Yukarıdaki kod kokuyor, bir yarış durumu var. Dizini koşulsuz olarak oluşturmanız FileExistsve işlevin bir tane atmak üzere tasarlanması durumunda (veya C # eşdeğeri ne olursa olsun) bir istisnayı yakalamanız gerekir .
Jo So

6
Diğerlerinin işaret ettiği gibi, çağrıya gerek yoktur Existsve aslında yeni bir başarısızlık durumu yaratır.
Ed S.

3
@MartinSmith: Sonra sadece dizini oluşturun. Daha önce varlığını kontrol etme. Bu sadece daha kısa değil. Ayrıca, API'nın ne olduğu hakkında yanlış bir izlenim vermez System.IO.Directory.CreateDirectory. (Ve daha hızlı, ama muhtemelen önemli değil)
Jo So

225

Sadece bu satırı yazın:

System.IO.Directory.CreateDirectory("my folder");
  • Klasör henüz yoksa , oluşturulur .
  • Klasör zaten varsa , satır yoksayılır .

Başvuru: MSDN'de Directory.CreateDirectory ile ilgili makale

Tabii ki, using System.IO;kaynak dosyanın en üstüne yazabilir ve daha sonra Directory.CreateDirectory("my folder");her klasör oluşturmak istediğinizde yazabilirsiniz .


28

Directory.CreateDirectory Varsa FilePath'in nasıl oluşturulacağını ve oluşturulacağını açıklar

Directory.ExistsBir FilePath olup olmadığını nasıl kontrol edeceğinizi açıklar. Ancak, CreateDirectory sizi kontrol edeceğinden buna ihtiyacınız yoktur.


@Tavousi jeroenh tarafından sağlanan bu işlevler iyi bir başlangıç ​​olacaktır;)
Allan Chua

msdn dokümantasyon bağlantılarının hiçbiri şu anda çalışıyor gibi görünüyor, msdn aramasıyla bile ...
jeroenh

bağlantılar şimdi iyi
Anand

Bu yarış koşullarını mümkün kılar, kabul edilen cevaba bakınız .
ComFreek

27

Aşağıdaki gibi bir yöntemle henüz yoksa yolu oluşturabilirsiniz:

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}

6
Kontrol if (!folderExists)gerekli değildir.
bazzilic

8
@bazzilic evet, ama niyetini ortaya koyuyor. API'nın bunu nasıl ele aldığını tahmin etmek (veya kesin olarak bilmek) zorunda değilim. Bu kodu okuyan herkes ne olacağını kesin olarak bilecektir.
Dennis Traub

4
Çok iş parçacıklı ortamlarda (dosya sisteminin durumu gibi) yalnızca kilitleme veya deneme ve yakalama seçeneğiniz vardır. Yukarıdaki pasajın bir yarış durumu vardır. İşlev bir FileExistsİstisna (veya C # olarak adlandırılan her şeyi) atabilir
Jo So

9
"niyetini ortaya koyuyor" - Bu iyi bir gerekçe değil. Sadece kodda bir yorum yazabilirsiniz.
Jim Balter

15

Bu yöntem yoksa klasör oluşturur ve varsa hiçbir şey yapmaz

Directory.CreateDirectory(path);

15

Bir try / catch deyimi kullanabilir ve var olup olmadığını kontrol edebilirsiniz:

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }

8
Bu iyi bir yanıttır, ancak MSDN belgelerine göre, "Zaten varolmadıkça veya yolun bir kısmı geçersiz olmadığı sürece, yolda belirtilen tüm dizinler oluşturulur. Path parametresi bir dosya yolunu değil, bir dizin yolunu belirtir Dizin zaten varsa, bu yöntem hiçbir şey yapmaz. " Yani, gerçekten Directory.Exists (yol) çağrısı gerekmez.
ken

2
Bu doğru ama aynı zamanda bir varsayım, bu yüzden MSDN'in söylediklerine bakılmaksızın kontrol etmek her zaman en iyisidir ..
MethodMan

6
@DJ KRAZE, yanlış olduğu kanıtlanmadığı sürece MSDN'ye inanıyorum. Bunun tersini öneririz - MSDN'nin söylediklerini göz ardı edin ve kodunuza fazladan (gereksiz) kontroller ekleyin. Çizgiyi nerede çiziyorsun?
Polyfun

1
ShellShock hiçbir yerde görmezden gelmiyorum .. Bu bir varsayım daha varsaymak için değil daha iyi olduğunu söylüyorum .. tekrar söylediklerimi okuyun .. teşekkürler
MethodMan

3
@ DJKRAZE kimse bir şey üstlenmiyor. El kitabında kontrolün gerekli olmadığı açıkça İngilizce olarak yazılmıştır.
bazzilic

14
using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);

12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}

3
CreateDirectory, dizinin bulunup bulunmadığını zaten kontrol eder.
bergmeister

6

Aşağıdaki kod, yoksa dizin oluşturacak şekilde kullandığım kodun en iyi satırıdır.

System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/temp/"));

Dizin zaten varsa, bu yöntem yeni bir dizin oluşturmaz, ancak varolan dizin için bir DirectoryInfo nesnesi döndürür. >


CreateDirectory, dizinin bulunup bulunmadığını zaten kontrol eder.
bergmeister

@bergmeister, teşekkürler. ben sadece kontrol geçti geçti. koşullu kontrol gerçekten kaldırıldı.
UJS

5

Bir üst klasörün yolu verildiğinde yeni klasör oluşturun:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • verilen yeni klasörün yolu
  • dizin bilgisi değişkeni, böylece istediğiniz gibi değiştirmeye devam edebilirsiniz.

0

Aşağıdaki kodu kullanın. Bu kodu dosya kopyalama ve yeni klasör oluşturma için kullandım.

string fileToCopy = "filelocation\\file_name.txt";
String server = Environment.UserName;
string newLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\file_name.txt";
string folderLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\";
bool exists = System.IO.Directory.Exists(folderLocation);

if (!exists)
{
   System.IO.Directory.CreateDirectory(folderLocation);
   if (System.IO.File.Exists(fileToCopy))
   {
     MessageBox.Show("file copied");
     System.IO.File.Copy(fileToCopy, newLocation, true);

   }
   else
   {
      MessageBox.Show("no such files");

   }
}

0

string createfolder = "E: / tmp /" + uId;
System.IO.Directory.CreateDirectory (createfolder);


0

Klasör resim klasörü veya diğer klasörler altında sunulmuyorsa bu Kodu kullanın

 string subPath = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/");
            bool exists = System.IO.Directory.Exists(subPath);
            if(!exists)
            System.IO.Directory.CreateDirectory(subPath); 
string path = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/" + OrderId + ".png");

-1

Süslü bir yol, FileUploadistediğiniz yöntemi kullanarak genişletmektir .

Bunu ekle:

public static class FileUploadExtension
{
    public static void SaveAs(this FileUpload, string destination, bool autoCreateDirectory) { 

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

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

        file.SaveAs(destination);
    }
}

Sonra kullanın:

FileUpload file;
...
file.SaveAs(path,true);

-3
string root = @"C:\Temp";

string subdir = @"C:\Temp\Mahesh";

// If directory does not exist, create it.

if (!Directory.Exists(root))
{

Directory.CreateDirectory(root);

}

CreateDirectory, bir alt dizin oluşturmak için de kullanılır. Tek yapmanız gereken bu alt dizinin oluşturulacağı dizinin yolunu belirtmektir. Aşağıdaki kod pasajı, içinde bir Mahesh alt dizini oluşturur C:\Temp directory.

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}

-5

Birden fazla cevaptan türetildi / birleştirildi, benim için uygulamak şu kadar kolaydı:

public void Init()
{
    String platypusDir = @"C:\platypus";
    CreateDirectoryIfDoesNotExist(platypusDir);
}

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}

6
Bir yöntemi, yalnızca biraz farklı bir adla, esasen tam bir kopyaya kapsüllemenin anlamı nedir? Kelimenin tam anlamıyla bundan hiçbir şey kazanmıyorsunuz.
Krythic
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.