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


202

मेरे पास यहाँ कोड का एक टुकड़ा है जो अगर निर्देशिका में मौजूद नहीं है तो टूट जाता है:

System.IO.File.WriteAllText(filePath, content);

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

मैं .NET 3.5 का उपयोग कर रहा हूं।



@TimSchmelter, "संभावित डुप्लिकेट" सफाई का एक तरीका है - इसी तरह के सवालों को बंद करना और सबसे अच्छे उत्तरों के साथ एक रखना। तारीख जरूरी नहीं है। Meta.stackexchange.com/questions/147643/… देखें यदि आप सहमत हैं कि इसे स्पष्टीकरण की आवश्यकता है, तो कृपया meta.stackexchange.com/questions/281980/…
माइकल फ्रीजिम

जवाबों:


394

बनाना

(new FileInfo(filePath)).Directory.Create() फाइल पर लिखने से पहले।

.... या, यदि यह मौजूद है, तो बनाएं (और कुछ नहीं करें)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);

5
सुरुचिपूर्ण समाधान क्योंकि यह उन परिस्थितियों को संभालता है जिन्हें नेस्टेड फ़ोल्डरों के निर्माण की आवश्यकता होती है।
डेनी जैकब

धन्यवाद! मैंने stackoverflow.com/questions/9065598 देखा , लेकिन मैं एक फ़ाइल के लिए पूर्ण पथ से शुरू करना चाहता था, और पथ को विभाजित करने से निपटना नहीं चाहता था। अब मुझे पता है कि आप FileInfo इंस्टेंस से डायरेक्टरी को एक्सेस कर सकते हैं।
जोहान

वहाँ ऐसा करने के लिए एक async तरीका है?
जो फिलिप्स

1
मुझे लगता है कि आप इसके साथ कर सकते हैं Task.Run(() => );
डॉन

107

आप निम्न कोड का उपयोग कर सकते हैं

  DirectoryInfo di = Directory.CreateDirectory(path);

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

13
यदि pathफ़ाइल है और निर्देशिका नहीं है तो IOException को फेंकता है। msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
scaryman

34

जैसा कि @hitec ने कहा, आपको यह सुनिश्चित करना होगा कि आपके पास सही अनुमतियां हैं, यदि आप ऐसा करते हैं, तो आप इस लाइन का उपयोग निर्देशिका के अस्तित्व को सुनिश्चित करने के लिए कर सकते हैं:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

अपनी फ़ाइल को किसी भी अयोग्य निर्देशिका में स्थानांतरित करने का एक सुंदर तरीका मूल फ़ाइलइन्फो क्लास में निम्न एक्सटेंशन बनाना है:

public static class FileInfoExtension
{
    //second parameter is need to avoid collision with native MoveTo
    public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 

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

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

        file.MoveTo(destination);
    }
}

फिर ब्रांड नए MoveTo एक्सटेंशन का उपयोग करें:

 using <namespace of FileInfoExtension>;
 ...
 new FileInfo("some path")
     .MoveTo("target path",true);

जाँच के तरीके विस्तार प्रलेखन


-1

फ़ाइल मौजूद है या नहीं यह जाँचने के लिए आप File.Exists का उपयोग कर सकते हैं और यदि आवश्यक हो तो File.Create का उपयोग करके इसे बना सकते हैं । सुनिश्चित करें कि आप जाँच करें कि आपके पास उस स्थान पर फ़ाइलें बनाने के लिए पहुँच है या नहीं।

एक बार जब आप निश्चित होते हैं कि फ़ाइल मौजूद है, तो आप इसे सुरक्षित रूप से लिख सकते हैं। हालांकि एहतियात के रूप में, आपको अपना कोड एक कोशिश में रखना चाहिए ... ब्लॉक को पकड़ना और अपवादों के लिए पकड़ना जो कि फ़ंक्शन को उठाने की संभावना है अगर चीजें बिल्कुल नियोजित नहीं होती हैं।

मूल फ़ाइल I / O अवधारणाओं के लिए अतिरिक्त जानकारी


मैंने शुरू में आपके प्रश्न को गलत तरीके से पढ़ा था जिसे आप एक ऐसी फ़ाइल में लिखना चाहते थे जो मौजूद न हो। अवधारणाएं फ़ाइल और निर्देशिका IO के लिए अनिवार्य रूप से समान हैं, हालांकि।
6

-2

var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

var file = new FileInfo(filePath);

file.Directory.Create(); यदि निर्देशिका पहले से मौजूद है, तो यह विधि कुछ भी नहीं करती है।

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.