यदि फ़ोल्डर मौजूद नहीं हैं, तो मैं फ़ाइल और किसी भी फ़ोल्डर को कैसे बनाऊँ?


136

कल्पना कीजिए कि मैं निम्नलिखित फ़ाइल बनाना (या लिखना) चाहता हूँ: - C:\Temp\Bar\Foo\Test.txt

File.Create (..) पद्धति का उपयोग करते हुए , यह कर सकता है।

लेकिन, अगर मेरे पास निम्न फ़ोल्डर में से एक नहीं है (उदाहरण के लिए पथ, ऊपर)

  • अस्थायी
  • बार
  • फू

तब मुझे एक DirectoryNotFoundException मिलती है ।

तो .. एक रास्ता दिया गया है, हम उस पथ के लिए फ़ाइल बनाने के लिए आवश्यक सभी फ़ोल्डर्स को पुन: कैसे बना सकते हैं? यदि Temp या Bar फ़ोल्डर्स मौजूद हैं, लेकिन Foo नहीं ... तो वह भी बनाया जाता है।

सरलता के लिए, मान लें कि कोई सुरक्षा चिंता नहीं है - सभी अनुमतियां ठीक हैं, आदि।



जवाबों:


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

इस MSDN पृष्ठ को देखें ।

आशा है कि मदद करता है!


82
आप नेत्रहीन पहले चेक के Directory.CreateDirectoryबिना कॉल कर सकते हैं Directory.Exists- यह नहीं फेंकेंगे यदि निर्देशिका पहले से ही है।
टिम रॉबिन्सन

1
@ टिम: यकीन नहीं था इसलिए मैंने इसे किसी भी तरह से फेंक दिया। हालांकि जानकारी के लिए धन्यवाद।
क्रिस्टोफर बी। एडकिंस

24
और Path.GetDirectoryName(string path)अपने पूर्ण पथ से निर्देशिका प्राप्त करने के बारे में मत भूलना
ओलिवर

@ ओलिवर: कार्यक्षमता की एक पूरी श्रृंखला है जो निर्देशिका और DirectoryInfo कक्षाओं के साथ जाती है, लेकिन मैंने जो कोड दिया वह उसे सही दिशा में एक धक्का देने के लिए पर्याप्त था। मुझे लगता है कि लिंक भी काफी विस्तार करता है।
क्रिस्टोफर बी। एडकिंस

8
* नोट: चर pathमें फ़ाइल का नाम नहीं होना चाहिए। तो ओपी के उदाहरण का उपयोग pathकरना चाहिए C:\Temp\Bar\FooDirectory.CreateDirectory(path);कॉल File.Create("C:\Temp\Bar\Foo\Test.txt");करने के बाद भी आपको फ़ाइल बनाने के लिए कॉल करना होगा।
सज़्र

139

यह बताने के लिए कि अन्य उत्तरों में क्या टिप्पणी की गई है:

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

Directory.CreateDirectory निर्देशिकाओं को पुनरावर्ती रूप से बनाएगा और यदि निर्देशिका पहले से मौजूद है तो यह बिना किसी त्रुटि के वापस आ जाएगी।

अगर वहाँ एक अपवाद Fooपर एक फ़ाइल C:\Temp\Bar\Fooहोने के लिए फेंक दिया जाएगा।


यदि आप लंबे रास्ते (256+) के साथ काम कर रहे हैं, तो stackoverflow.com/questions/5188527/…
अलेक्सई लेवेनकोव


3

। एक पथ दिया गया है, हम उस पथ के लिए फ़ाइल बनाने के लिए आवश्यक सभी फ़ोल्डर्स पुन: कैसे बना सकते हैं

पथ द्वारा निर्दिष्ट के रूप में सभी निर्देशिका और उपनिर्देशिका बनाता है।

Directory.CreateDirectory(path);

तब आप एक फ़ाइल बना सकते हैं।


2
फ़ाइल नाम के बिना पथ :)
समीरा आर।

"सभी निर्देशिकाएं और उपनिर्देशिकाएं" गलत: यह अधिकतम, एक निर्देशिका और सभी आवश्यक उपनिर्देशिकाओं को बनाएगी।
कैमिलो टेरेविंटो

3

आपको पथ के दोनों हिस्सों (निर्देशिका और फ़ाइल नाम) की जांच करनी होगी और यदि मौजूद नहीं है तो प्रत्येक को बनाना होगा।

उपयोग करें File.Existsऔर Directory.Existsपता करें कि क्या वे मौजूद हैं। Directory.CreateDirectoryआपके लिए पूरे रास्ते का निर्माण करेगा, इसलिए आपको केवल कभी यह कॉल करने की आवश्यकता है कि यदि निर्देशिका मौजूद नहीं है, तो बस फ़ाइल बनाएं।


Directory.CreateDirectory के लिए आपको यह देखने की आवश्यकता नहीं है कि कौन सा भाग मौजूद है। यह आवश्यक सभी निर्देशिकाओं को बनाएगा (केवल यह सुनिश्चित करने के लिए कि लक्षित निर्देशिका पहले से मौजूद नहीं है)।
गर्त्जन

मेरा सुझाव है कि आप उस मामले में पहली पंक्ति को हटा दें क्योंकि उसे रूट से प्रत्येक भाग की जांच करने की आवश्यकता नहीं है, बस पूरा पथ जांचें और यदि यह मौजूद नहीं है तो इसे बनाएं।
गर्टजन

); - @Gertjan जवाब अद्यतन ... आशा यह अपने मानकों को पूरा करती है अब
Oded

:) यह करता है :) (यह आपको गलत साबित करने या आपको अपमानित करने के लिए मेरी बात नहीं थी, लेकिन शुरुआती जवाबों में किसी भी स्पष्टीकरण का उपयोग कर सकते हैं)
गर्टजन


0

आप निर्देशिका चाहते हैं। बनाएँडायरेक्टरी ()

यहाँ एक वर्ग है जिसका मैं उपयोग करता हूं (C # में कनवर्ट किया गया) यदि आप इसे स्रोत निर्देशिका और किसी गंतव्य को पास करते हैं, तो यह उस निर्देशिका की सभी फ़ाइलों और उप-फ़ोल्डरों को आपके गंतव्य पर कॉपी कर देगा:

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
मुझे इस लाइन के कारण इसे डाउनग्रेड करना चाहिए: using Microsoft.VisualBasic;ईविल !!
प्योर.क्रोम जूल

2
और क्यों Microsoft.VisualBasic बुराई है ?? यह .Net फ्रेमवर्क में किसी और की तरह एक विधानसभा है।
ओलिवर

2
मुझे लगता है क्योंकि आपका आयात एक पूरी अन्य भाषा के नाम स्थान को अनावश्यक रूप से आयात करता है ..?
मार्क

0

यह मानते हुए कि आपके असेंबली / एक्सई के पास फ़ाइलियो अनुमति है ही, अच्छी तरह से सही नहीं है। आपका आवेदन व्यवस्थापक अधिकारों के साथ नहीं चल सकता है। कोड एक्सेस सिक्योरिटी और रिक्वेस्ट परमिशन सैंपल कोड पर विचार करना महत्वपूर्ण है :

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 कोड एक्सेस सुरक्षा को समझना

क्या किसी वास्तविक दुनिया के "कोड एक्सेस सुरक्षा" का उपयोग किया जाता है?


1
@ Pure.Krome: हालांकि मेरा जवाब लक्ष्य से दूर है, फिर भी विशेषाधिकार प्राप्त संसाधन तक पहुँचने पर सुरक्षा और अभिगम नियंत्रण पर विचार करें। कभी भी अपने प्रश्न से आगे निकलने या उलझने का मतलब नहीं है :)
PRR

0

मुझे पता है कि यहां कुछ अन्य उत्तर हैं, लेकिन उनमें से कोई भी पर्याप्त नहीं है, निम्नलिखित कोड निर्देशिका बनाएगा (यदि मौजूद नहीं है) और फिर फ़ाइलों की प्रतिलिपि बनाएँ

// 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"));
        }
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.