2010-07-08 14 views
84

कल्पना मैं (ऊपर लिख या) निम्न फ़ाइल बनाना चाहते हैं: - C:\Temp\Bar\Foo\Test.txtफ़ोल्डर्स मौजूद नहीं होने पर, मैं एक फ़ाइल और कोई फ़ोल्डर कैसे बना सकता हूं?

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

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

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

तो मैं मिल की जरूरत नहीं है एक DirectoryNotFoundException फेंक दिया।

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

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

+1

(http://stackoverflow.com/questions/660685/saving-a-file-and-automatically-create-directories) की – mateuscb

+0

संभावित डुप्लिकेट [एक फ़ाइल को सहेजने और स्वचालित रूप से निर्देशिका बनाएं] के संभावित डुप्लिकेट [ यदि कोई फ़ोल्डर मौजूद नहीं है, तो इसे बनाएं] (http://stackoverflow.com/questions/9065598/if-a-folder-does-not-exist-create-it) –

उत्तर

80
// Determine whether the directory exists. 
if (Directory.Exists(path)) 
{ 
    Console.WriteLine("That path exists already."); 
    return; 
} 

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

this MSDN page देखें।

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

+68

आप 'Directory.Exists' जांच के बिना 'निर्देशिका.क्रिएट डायरेक्टरी' को अंधाधुंध रूप से कॉल कर सकते हैं - यदि निर्देशिका पहले से मौजूद है तो यह फेंक नहीं जाएगी। –

+1

@Tim: यकीन नहीं था इसलिए मैंने इसे वहां पर फेंक दिया। हालांकि जानकारी के लिए धन्यवाद। – Adkins

+15

और निर्देशिका से प्राप्त करने के लिए ['path.GetDirectoryName (स्ट्रिंग पथ)'] (http://msdn.microsoft.com/en-us/library/system.io.path.getdirectoryname.aspx) के बारे में न भूलें आपका पूरा पथ – Oliver

2

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

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

+0

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

+0

@Gertjan - आपके इनपुट के लिए धन्यवाद। उत्तर स्पष्ट किया गया। – Oded

+0

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

16

फ़ाइल बनाने से पहले Directory.CreateDirectory का उपयोग करें। यह आपके लिए फ़ोल्डर को दोबारा बनाता है।

2

आपको Directory.CreateDirectory का उपयोग करना चाहिए।

http://msdn.microsoft.com/en-us/library/54a0at6s.aspx

+0

* टिप्पणियां: पथ में निर्दिष्ट किसी भी और सभी निर्देशिकाएं बनाई गई हैं * ... आह kewl! चीयर्स :) –

2

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

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

Directory.CreateDirectory(path); 

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

+2

फ़ाइल नाम के बिना पथ :) –

+0

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

0

आप चाहते Directory.CreateDirectory()

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

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

मैं इस लाइन की वजह से इस डाउनग्रेड करना होगा: 'Microsoft.VisualBasic उपयोग करते हुए;' ईविल !! –

+0

Haha, खेद मैं पूरी तरह से जांच नहीं की यह सिर्फ .. एक कनवर्टर में यह अटक मेरा बुरा .. – Markive

+1

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

0

यह मानते हुए कि अपने विधानसभा/exe FileIO अनुमति ही है, अच्छी तरह से सही नहीं है।आपका आवेदन व्यवस्थापक अधिकारों के साथ नहीं चल सकता है। इसके Code Access Security और requestingpermissions नमूना कोड पर विचार करना महत्वपूर्ण:

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

Understanding .NET Code Access Security

Is “Code Access Security” of any real world use?

+1

@ शुद्ध। क्रोम: हालांकि मेरा जवाब लक्ष्य से बाहर है, फिर भी विशेषाधिकार प्राप्त संसाधन तक पहुंचने पर सुरक्षा और अभिगम नियंत्रण पर विचार करें। कभी भी अपने प्रश्न को आगे बढ़ाने या जटिल करने का मतलब नहीं था :) – PRR

87

संक्षेप में क्या अन्य उत्तर में टिप्पणी की गई है:

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

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

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

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")); 
     } 
    } 
} 
संबंधित मुद्दे