Jika folder tidak ada, buatlah

720

Saya menggunakan kontrol FileUploader di aplikasi saya. Saya ingin menyimpan file di folder yang ditentukan. Sekarang saya ingin, jika folder ini tidak ada, untuk membuatnya terlebih dahulu, dan kemudian menyimpan file saya ke folder ini. Jika folder sudah ada, maka cukup simpan file di dalamnya.

Bagaimana saya bisa melakukan ini?

Tavousi
sumber
@ JoBlow - Ha - seharusnya menentukan jawaban yang salah - sekarang halaman ini lebih membingungkan. (Apakah dia mengubah jawaban yang diterima? Atau tidak? OMG!) ;-)
Bartosz
Saya berakhir di sini sambil mencari hal-hal lain, tetapi sungguh menakjubkan betapa banyak orang yang berjuang untuk saling berkontradiksi dengan versi mereka sendiri dari cerita yang sama. Microsoft menulis .NET Framework dan MSDN. Apakah perilaku yang benar dihormati oleh pelaksana lainnya, seperti Mono, tidak relevan dengan kebenaran perilaku yang dijelaskan dalam MSDN. Oh, dan Mono melakukan hal yang benar juga, jadi di mana argumennya?
monkey0506

Jawaban:

1239

Seperti yang orang lain katakan, gunakan System.IO.Directory.CreateDirectory

Tapi, Anda tidak perlu memeriksa apakah itu ada terlebih dahulu. Dari dokumen

Setiap dan semua direktori yang ditentukan dalam path dibuat, kecuali mereka sudah ada atau kecuali beberapa bagian dari path tidak valid. Jika direktori sudah ada, metode ini tidak membuat direktori baru, tetapi mengembalikan objek DirectoryInfo untuk direktori yang ada.

Mark Peters
sumber
25
namun contoh kode microsoft bertentangan dengan dirinya sendiri dengan memeriksa apakah direktori tersebut ada terlebih dahulu ...
ecoe
1
Jadi kita harus memeriksa apakah ada atau tidak? Jika kita periksa dan kemudian juga metode CreateDirectory memeriksa lagi, kita melakukan pemeriksaan dua kali ... dan operasi sistem file AFAIK mahal
Giox
3
@Muflix seperti ini - buat file misalnya "FILENAME" pada direktori tetapi jangan berikan ekstensi apa pun. Kemudian coba panggil Directory.Exists ("FILENAME") akan mengembalikan false, sebagaimana mestinya karena tidak ada direktori tersebut. Sekarang jika Anda memanggil CreateDirectory ("FILENAME") itu akan gagal total sebagaimana mestinya karena sudah ada "sesuatu" dengan nama itu di sana. Harapan itu masuk akal.
Otávio Décio
1
SALAH! I You HARUS memeriksa apakah folder itu ada. Saya baru mengidentifikasi bahwa metode ini memiliki masalah serius. Jika Anda tidak memeriksa keberadaan folder, pegangan Folder akan bocor kecuali Anda secara khusus melepaskannya. Kami menggunakan contoh ini dalam aplikasi yang memproses jutaan folder. Setiap kali metode ini dipanggil, aplikasi mempertahankan pegangan file ke direktori. Setelah beberapa jam, Corporate Network NAS membuka jutaan Penanganan File di folder. Memperbarui untuk menyertakan cek gratis itu pegangannya
soddoff Baldrick
356

Gunakan kode di bawah ini sesuai http://forums.asp.net/p/1226236/2209871.aspx :

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));
Ravia
sumber
41
Mengapa tidak: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Dayan
159
Tidak perlu memeriksa apakah folder ada. Baca manual dengan seksama.
bazzilic
30
Memeriksa dan membuat bukanlah atom. Kode di atas berbau, ada kondisi balapan. Anda sebaiknya membuat direktori tanpa syarat, dan menangkap FileExistspengecualian (atau apa pun yang setara dengan C #) jika fungsi tersebut dirancang untuk melempar satu direktori .
Jo So
6
Seperti yang telah ditunjukkan orang lain, tidak perlu untuk menelepon Existsdan itu benar-benar menciptakan kondisi kegagalan baru.
Ed S.
3
@ MartinSmith: Kalau begitu buat saja direktori. Jangan periksa keberadaan sebelumnya. Itu tidak hanya lebih pendek. Itu juga tidak memberikan kesan yang salah tentang apa API System.IO.Directory.CreateDirectoryitu. (Dan itu lebih cepat, tapi mungkin itu tidak masalah)
Jo So
224

Tulis saja baris ini:

System.IO.Directory.CreateDirectory("my folder");
  • Jika folder belum ada , itu akan dibuat .
  • Jika folder sudah ada , saluran akan diabaikan .

Referensi: Artikel tentang Directory.CreateDirectory di MSDN

Tentu saja, Anda juga dapat menulis using System.IO;di bagian atas file sumber dan kemudian hanya menulis Directory.CreateDirectory("my folder");setiap kali Anda ingin membuat folder.

Nicolas Raoul
sumber
28

Directory.CreateDirectory Menjelaskan cara mencoba dan membuat FilePath jika tidak ada

Directory.ExistsMenjelaskan cara memeriksa apakah FilePath ada. Namun, Anda tidak memerlukan ini karena CreateDirectory akan memeriksa Anda.

Jeroenh
sumber
@Tavousi fungsi ini disediakan oleh jeroenh akan menjadi awal yang baik;)
Allan Chua
tidak ada tautan dokumentasi msdn yang tampaknya berfungsi saat ini, bahkan melalui pencarian
msdn
Anand
Ini memungkinkan kondisi lomba, lihat jawaban yang diterima .
ComFreek
27

Anda dapat membuat jalur jika belum ada dengan metode seperti berikut:

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}
Dennis Traub
sumber
6
Periksa if (!folderExists)tidak diperlukan.
bazzilic
8
@azzazz ya, tapi itu mengungkapkan niat. Saya tidak perlu menebak (atau tahu pasti) bagaimana API menangani ini. Siapa pun yang membaca kode ini akan tahu pasti apa yang akan terjadi.
Dennis Traub
4
Dalam lingkungan multithreaded (seperti keadaan sistem file) Anda hanya memiliki pilihan untuk mengunci atau mencoba-dan-menangkap. Cuplikan di atas memiliki kondisi balapan. Fungsi ini mungkin membuang FileExistsPengecualian (atau apa pun namanya C #)
Jo So
9
"itu mengungkapkan niat" - Ini bukan pembenaran yang baik. Anda bisa menulis komentar di kode.
Jim Balter
15

Metode ini akan membuat folder jika tidak ada dan tidak melakukan apa pun jika ada

Directory.CreateDirectory(path);
Thakur Rock
sumber
15

Anda dapat menggunakan klausa coba / tangkap dan periksa untuk melihat apakah ada:

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }
MethodMan
sumber
8
Ini adalah jawaban yang baik, tetapi, menurut dokumentasi MSDN, "Setiap dan semua direktori yang ditentukan dalam path dibuat, kecuali mereka sudah ada atau kecuali beberapa bagian dari path tidak valid. Parameter path menentukan path direktori, bukan path file Jika direktori sudah ada, metode ini tidak melakukan apa pun. " Jadi, Anda tidak benar-benar membutuhkan panggilan ke Directory.Exists (path).
ken
2
Itu benar tetapi itu juga asumsi sehingga selalu lebih baik untuk memeriksa daripada mengasumsikan terlepas dari apa yang dikatakan MSDN ..
MethodMan
6
@JJ KRAZE, saya percaya MSDN kecuali telah terbukti salah. Anda merekomendasikan yang sebaliknya - abaikan apa yang dikatakan MSDN dan tambahkan pemeriksaan tambahan (yang tidak perlu) ke dalam kode Anda. Di mana Anda menggambar garis?
Polyfun
1
ShellShock tidak ada tempat saya katakan abaikan .. ini adalah pernyataan persumtious Saya katakan lebih baik untuk tidak menganggap daripada mengasumsikan .. membaca apa yang telah saya nyatakan sekali lagi .. terima kasih
MethodMan
3
@DJKRAZE tidak ada yang menganggap apa pun. Itu ditulis dalam bahasa Inggris biasa di manual bahwa cek tidak perlu.
bazzilic
14
using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);
Beruang hitam
sumber
12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}
Kiran Solkar
sumber
3
CreateDirectory sudah menangani pemeriksaan jika direktori tidak ada.
bergmeister
6

Kode berikut adalah baris kode terbaik yang saya gunakan yang akan membuat direktori jika tidak ada.

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

Jika direktori sudah ada, metode ini tidak membuat direktori baru, tetapi mengembalikan objek DirectoryInfo untuk direktori yang ada. >

UJS
sumber
CreateDirectory sudah menangani pemeriksaan jika direktori tidak ada.
bergmeister
@bergmeister, Terima kasih. Saya baru saja menyeberang memeriksa. Ini benar-benar menghapus cek bersyarat. Diperbarui !!
UJS
5

Buat folder baru, diberi jalur folder orang tua:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • path ke folder baru yang diberikan
  • variabel info direktori sehingga Anda dapat terus memanipulasi sesuka Anda.
BKSpurgeon
sumber
0

Gunakan kode di bawah ini. Saya menggunakan kode ini untuk menyalin file dan membuat folder baru.

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

   }
}
Lemon Kazi
sumber
0

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

ya
sumber
0

Gunakan Kode ini jika folder tidak disajikan di bawah folder gambar atau folder lain

 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");
Jogi
sumber
-1

Cara yang mewah adalah dengan memperpanjang FileUpload dengan metode yang Anda inginkan.

Tambahkan ini:

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

Kemudian gunakan:

FileUpload file;
...
file.SaveAs(path,true);
MiguelSlv
sumber
-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 juga digunakan untuk membuat sub direktori. Yang harus Anda lakukan adalah menentukan jalur direktori tempat subdirektori ini akan dibuat. Potongan kode berikut ini membuat subdirektori Mahesh di C:\Temp directory.

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}
uksp
sumber
-5

Berasal / digabungkan dari beberapa jawaban, mengimplementasikannya untuk saya semudah ini:

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

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}
B. Clay Shannon
sumber
6
Apa gunanya merangkum suatu metode ke dalam apa yang pada dasarnya merupakan salinan persis, dengan hanya nama yang sedikit berbeda? Anda benar-benar tidak mendapatkan apa-apa dari ini.
Krythic