यदि कोई फ़ोल्डर मौजूद नहीं है, तो इसे बनाएं


720

मैं अपने एप्लिकेशन में FileUploader नियंत्रण का उपयोग करता हूं। मैं एक निर्दिष्ट फ़ोल्डर में एक फ़ाइल को सहेजना चाहता हूं। अब मैं चाहता हूं, यदि यह फ़ोल्डर मौजूद नहीं है, तो पहले इसे बनाने के लिए, और फिर इस फ़ोल्डर में मेरी फ़ाइल सहेजें। यदि फ़ोल्डर पहले से मौजूद है, तो बस इसमें फ़ाइल सहेजें।

मैं यह कैसे कर सकता हूं?


@JoeBlow - हा - को निर्दिष्ट करना चाहिए कि कौन सा उत्तर गलत है - अब पृष्ठ और भी अधिक भ्रामक है। (क्या उसने स्वीकार किए गए उत्तर को बदल दिया? या वह नहीं था? OMG!) ;-)
बार्टोज़

मैं अन्य चीजों की तलाश करते हुए यहां समाप्त हुआ, लेकिन यह आश्चर्यजनक है कि कितने लोग एक ही कहानी के अपने संस्करण के साथ एक-दूसरे के विरोधाभास के लिए लड़ रहे हैं। Microsoft ने .NET फ्रेमवर्क और MSDN को लिखा है। क्या सही व्यवहार अन्य कार्यान्वयनकर्ताओं द्वारा किया जाता है, जैसे कि मोनो, MSDN में वर्णित व्यवहार की शुद्धता के लिए अप्रासंगिक है। ओह, और मोनो भी सही काम करता है, तो तर्क कहाँ है?
बंदर ०५०६

जवाबों:


1238

जैसा कि दूसरों ने कहा है, उपयोग करें System.IO.Directory.CreateDirectory

लेकिन, आपको यह जाँचने की आवश्यकता नहीं है कि क्या यह पहले से मौजूद है। से डॉक्स

पथ में निर्दिष्ट कोई भी और सभी निर्देशिका तब तक बनाई जाती हैं, जब तक कि वे पहले से मौजूद न हों या जब तक कि पथ का कुछ हिस्सा अमान्य न हो। यदि निर्देशिका पहले से मौजूद है, तो यह विधि एक नई निर्देशिका नहीं बनाती है, लेकिन यह मौजूदा निर्देशिका के लिए DirectoryInfo ऑब्जेक्ट देता है।



25
और फिर भी Microsoft कोड उदाहरण के पहले निर्देशिका मौजूद होने की जाँच करके स्वयं का विरोधाभास करता है ...
Ecoe

1
इसलिए हमें जांचना होगा कि क्या यह मौजूद है या नहीं? यदि हम जांच करते हैं और फिर CreateDirectory विधि फिर से जांचते हैं, तो हम दो बार जांच करते हैं ... और AFAIK फाइलसिस्टम ऑपरेशन महंगे हैं
Giox

3
@Muflix इस तरह - एक निर्देशिका पर उदाहरण के लिए "FILENAME" के लिए एक फ़ाइल बनाएँ, लेकिन इसे कोई एक्सटेंशन न दें। उसके बाद Directory.Exists ("FILENAME") को कॉल करने का प्रयास करें, यह गलत है, क्योंकि यह होना चाहिए क्योंकि ऐसी कोई निर्देशिका नहीं है। अब अगर आप CreateDirectory ("FILENAME") कहते हैं, तो यह बुरी तरह से विफल हो जाएगा क्योंकि यह होना चाहिए क्योंकि वहाँ पहले से ही उस नाम के साथ "कुछ" है। आशा है कि समझ में आता है।
ओटवियो डेसिओ

1
गलत! यदि आप फ़ोल्डर मौजूद हैं तो मैं आपको अवश्य देखना चाहिए। मैंने अभी पहचाना है कि इस पद्धति में एक गंभीर समस्या है। यदि आप फ़ोल्डर के अस्तित्व की जांच नहीं करते हैं, तो जब तक आप इसे विशेष रूप से जारी नहीं करेंगे तब तक फ़ोल्डर हैंडल लीक हो जाएगा। हमने इस उदाहरण का उपयोग एक एप्लिकेशन में किया है जो लाखों फ़ोल्डरों को संसाधित करता है। हर बार इस पद्धति को कॉल करने के बाद, एप्लिकेशन ने डायरेक्टरी में फ़ाइल हैंडल को बरकरार रखा। कई घंटों के बाद, कॉर्पोरेट नेटवर्क एनएएस में फ़ोल्डर्स पर लाखों फ़ाइल हैंडल खुले थे। चेक मुक्त हैंडल को शामिल करने के लिए अद्यतन
soddoff Baldrick

356

नीचे दिए गए कोड का उपयोग 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));

41
क्यों नहीं: यदि (Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
दयान

158
यदि फ़ोल्डर मौजूद है, तो जांचने की कोई आवश्यकता नहीं है। मैनुअल को ध्यान से पढ़ें।
जैज

30
जाँच करना और बनाना परमाणु नहीं है। उपरोक्त कोड बदबू आ रही है, एक दौड़ की स्थिति है। यदि आप FileExistsफ़ंक्शन को एक फेंकने के लिए डिज़ाइन किया गया है , तो आपको बेहतर रूप से बिना शर्त के निर्देशिका बनाना चाहिए, और (या जो भी # C # समतुल्य) अपवाद है उसे पकड़ना चाहिए ।
जो

6
जैसे अन्य लोगों ने बताया है, कॉल की कोई आवश्यकता नहीं है Existsऔर यह वास्तव में एक नई विफलता की स्थिति पैदा करता है।
एड।

3
@MartinSmith: तो बस निर्देशिका बनाएँ। पहले अस्तित्व की जाँच मत करो। यह न केवल कम है। यह एपीआई क्या है की गलत धारणा भी नहीं देता System.IO.Directory.CreateDirectoryहै। (और यह तेज़ है, लेकिन शायद इससे कोई फर्क नहीं पड़ता)
जो

223

बस इस लाइन को लिखें:

System.IO.Directory.CreateDirectory("my folder");
  • यदि फ़ोल्डर अभी तक मौजूद नहीं है , तो इसे बनाया जाएगा ।
  • यदि फ़ोल्डर पहले से मौजूद है , तो लाइन को अनदेखा कर दिया जाएगा ।

संदर्भ: निर्देशिका के बारे में लेख। MSDN पर बनाएँ अप्रत्यक्ष

बेशक, आप using System.IO;स्रोत फ़ाइल के शीर्ष पर भी लिख सकते हैं और फिर Directory.CreateDirectory("my folder");हर बार जब आप एक फ़ोल्डर बनाना चाहते हैं, तब लिख सकते हैं।


28

Directory.CreateDirectory अगर यह मौजूद नहीं है, तो फ़ाइलपैथ को बनाने और बनाने की कोशिश करें

Directory.Existsबताते हैं कि कैसे एक FilePath मौजूद है की जाँच करने के लिए। हालाँकि, आपको इसकी आवश्यकता नहीं है क्योंकि CreateDirectory आपके लिए जाँच करेगी।


@ जोशी द्वारा प्रदान किए गए इस कार्य की शुरुआत अच्छी होगी;)
एलन

msdn प्रलेखन लिंक में से कोई भी इस समय काम नहीं कर रहा है, यहां तक ​​कि msdn खोज के माध्यम से भी ...
jeroenh

लिंक अब ठीक हैं
आनंद

यह दौड़ की स्थिति को सक्षम करता है, स्वीकृत उत्तर देखें ।
कॉमफ्रीक

27

आप पथ बना सकते हैं यदि यह निम्न की तरह एक विधि के साथ अभी तक मौजूद नहीं है:

using System.IO;

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

6
जांच if (!folderExists)की जरूरत नहीं है।
जैज

8
@bazzilic हाँ, लेकिन इससे इरादे का पता चलता है। मुझे अनुमान नहीं है (या निश्चित रूप से पता है) कि एपीआई इसे कैसे संभालता है। जो कोई भी इस कोड को पढ़ता है वह निश्चित रूप से जान जाएगा कि क्या होगा।
डेनिस ट्राउब

4
मल्टीथ्रेडेड वातावरण (जैसे कि एक फ़ाइल सिस्टम की स्थिति) में आपके पास केवल लॉकिंग या ट्राइ-एंड-कैच का विकल्प होता है। ऊपर के स्निपेट में एक दौड़ की स्थिति है। समारोह में FileExistsअपवाद (या इसे C # में जो भी कहा जाता है) फेंक सकते हैं
जो

9
"यह आशय प्रकट करता है" - यह एक अच्छा औचित्य नहीं है। आप कोड में एक टिप्पणी लिख सकते हैं।
जिम बाल्टर

15

यह विधि मौजूद नहीं होने पर फ़ोल्डर बनाएगी और मौजूद होने पर कुछ भी नहीं करेगी

Directory.CreateDirectory(path);

15

आप एक कोशिश / पकड़ क्लॉज़ का उपयोग कर सकते हैं और यह देखने के लिए जाँच कर सकते हैं कि क्या यह मौजूद है:

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

8
यह एक अच्छा जवाब है, लेकिन, MSDN प्रलेखन के अनुसार, "पथ में निर्दिष्ट कोई भी और सभी निर्देशिका तब तक बनाई जाती हैं, जब तक कि वे पहले से मौजूद न हों या जब तक कि पथ का कुछ हिस्सा अमान्य न हो। पथ पैरामीटर एक निर्देशिका पथ निर्दिष्ट करता है, न कि फ़ाइल पथ। । यदि निर्देशिका पहले से मौजूद है, तो यह विधि कुछ नहीं करती है। " इसलिए, आपको वास्तव में Directory.Exists (पथ) पर कॉल की आवश्यकता नहीं है।
केन

2
यह सच है, लेकिन यह भी एक
धारणा है

6
@DJ KRAZE, मेरा मानना ​​है कि MSDN जब तक यह गलत साबित नहीं हुआ है। आप इसके विपरीत सलाह देते हैं - MSDN जो कहता है उसे अनदेखा करें और अपने कोड में अतिरिक्त (अनावश्यक) जांच जोड़ें। आपने पंक्ति को कहां खींचा था?
पॉलीफुन

1
शेलशॉक कहीं भी मुझे अनदेखा नहीं करता है .. यह एक प्रेरक कथन है जो मैं कह रहा हूं कि यह मानने से बेहतर नहीं है कि मान लें .. जो मैंने एक बार फिर से कहा है उसे पढ़ें .. धन्यवाद
मेथडामन

3
@DJKRAZE किसी को कुछ भी नहीं मान रहा है। यह मैनुअल में सादे अंग्रेजी में लिखा है कि जांच आवश्यक नहीं है।
जैज


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

3
अगर डायरेक्टरी मौजूद नहीं है, तो CreateDirectory पहले ही चेक को हैंडल कर देती है।
bergmeister

6

निम्नलिखित कोड मैं उपयोग की जाने वाली कोड की सबसे अच्छी लाइन (पंक्तियाँ) है जो यदि मौजूद नहीं है तो निर्देशिका बनाएगी।

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

यदि निर्देशिका पहले से मौजूद है, तो यह विधि एक नई निर्देशिका नहीं बनाती है, लेकिन यह मौजूदा निर्देशिका के लिए DirectoryInfo ऑब्जेक्ट देता है। >


अगर डायरेक्टरी मौजूद नहीं है, तो CreateDirectory पहले ही चेक को हैंडल कर देती है।
bergmeister

@bergmeister, धन्यवाद। मैंने अभी-अभी चेक किया है। यह वास्तव में सशर्त जाँच को हटा दिया है। अद्यतन !!
UJS

4

यह वह उत्तर था जिसकी मुझे तलाश थी, लेकिन आसानी से नहीं मिली:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • नए फ़ोल्डर को पथ दिया गया
  • निर्देशिका जानकारी चर ताकि आप इसे कृपया जारी रख सकें।

0

नीचे दिए गए कोड का उपयोग करें। मैंने इस कोड का उपयोग फ़ाइल कॉपी और नया फ़ोल्डर बनाने के लिए किया है।

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 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

एक फैंसी तरीका यह है FileUploadकि आप जो विधि चाहते हैं, उसका विस्तार करें ।

इसे जोड़ो:

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

फिर इसका उपयोग करें:

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 का उपयोग उप निर्देशिका बनाने के लिए भी किया जाता है। आपको बस उस निर्देशिका का पथ निर्दिष्ट करना है जिसमें यह उपनिर्देशिका बनाई जाएगी। निम्नलिखित कोड स्निपेट एक महेश उपनिर्देशिका बनाता है C:\Temp directory

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}

-5

कई उत्तरों से व्युत्पन्न / संयुक्त, मेरे लिए इसे लागू करना उतना ही आसान था:

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

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

6
किसी विधि को अनिवार्य रूप से एक सटीक प्रतिलिपि बनाने के बिंदु को केवल थोड़े अलग नाम से क्या कहते हैं? आप सचमुच इससे कुछ हासिल नहीं करते।
क्रीथिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.