2009-01-13 13 views
17

में फ़ोल्डर संरचना को दोहराने के लिए फ़ंक्शन मुझे एक साधारण फ़ंक्शन की आवश्यकता है जो एक फ़ाइलइन्फो और एक गंतव्य_डिरेक्टरी_नाम इनपुट के रूप में ले जाएगा, fileinfo से फ़ाइल पथ प्राप्त करें और इसे दूसरे पैरामीटर के रूप में pass_directory_name में दोहराएं।सी # - फ़ाइल पथ

पूर्व के लिए। filepath "d: \ recordings \ location1 \ client1 \ job1 \ file1.ext फ़ंक्शन को गंतव्य_डिरेक्टरी_नाम में निर्देशिकाएं बनाना चाहिए यदि वे मौजूद नहीं हैं और निर्देशिका बनाने के बाद फ़ाइल कॉपी करते हैं।

+0

सबसे आसान तरीका: http://stackoverflow.com/questions/58744/best-way-to-copy-the-entire-contents-of-a-directory-in-c-sharp –

+0

का चयन करें [ यह उत्तर] (https://stackoverflow.com/a/1147243) तो यह भविष्य के आगंतुकों के लिए शीर्ष पर आता है। वर्तमान में चयनित उत्तर अनावश्यक रूप से जटिल और भ्रामक है। – jnm2

उत्तर

31

मैं निम्नलिखित का उपयोग कर रहा हूं

// path is your file path 
string directory = Path.GetDirectoryName(path); 
CreateDirectory(new DirectoryInfo(directory)); 
+0

प्यारा, इतना आसान भी! – Calanus

+0

उत्तर के लिए धन्यवाद। यहां तक ​​कि मैं इसे अपने आवेदन में से एक के लिए चाहता था – Ravisha

+1

हालांकि यह समाधान समाधान कर रहा है, एंडी का जवाब रास्ता अधिक सुविधाजनक है, इसलिए कृपया इसे इसके बजाय स्वीकार करने पर विचार करें। सचमुच आपको अपने रास्ते में सभी नेस्टेड फ़ोल्डर बनाने के बारे में चिंता करने की ज़रूरत नहीं है - विधि System.IO.Directory.CreateDirectory() यदि कोई भी भाग मिस जाएगा तो स्वचालित रूप से उन सभी को बनाने का प्रयास करेगा। – Sevenate

46

System.IO.Directory.CreateDirectory अंतिम निर्देशिका बनाने के लिए इस्तेमाल किया जा सकता है, यह भी अपने आप में सभी फ़ोल्डर पैदा करेगा:

public static void CreateDirectory(DirectoryInfo directory) 
{ 
    if (!directory.Parent.Exists) 
     CreateDirectory(directory.Parent); 
    directory.Create(); 
} 

इस तरह से यह प्रयोग करें: उस उद्देश्य के लिए विधि पथ अगर वे डी ओ अस्तित्व में नहीं है।

//Will create all three directories (if they do not already exist). 
System.IO.Directory.CreateDirectory("C:\\First\\Second\\Third") 
+0

की तुलना में अधिक वोटों का हकदार है, मुझे लगता है कि यदि आप इसमें कुछ और विवरण डालते हैं, तो बस एक साधारण कोड उदाहरण और एमएसडीएन दस्तावेज़ों के लिए एक लिंक, और अपर्याप्त साइन-ऑफ को हटा दिया गया है, इससे इसके लिए और अधिक अर्थ होगा स्वीकृत उत्तर हो। –

+1

यह समझने के लिए बहुत सरल लगता है। उदाहरण की आवश्यकता क्यों है। कृपया देखें: http://msdn.microsoft.com/en-us/library/system.io.directory.createdirectory(VS.71).aspx – Samuel

+2

स्पष्टीकरण की कोई आवश्यकता नहीं है। कोड स्निपेट पर्याप्त है। इसके अलावा एमएसडीएन विशेष रूप से बताता है कि ".. यदि वे मौजूद नहीं हैं तो यह स्वचालित रूप से पथ में सभी फ़ोल्डरों को बना देगा", और @ एंडी सही है। – bleepzter

3

@ NTDLS के जवाब के आधार पर यहां एक विधि है कि गंतव्य के लिए स्रोत को दोहराने जाएगा। यह मामला संभालता है जहां स्रोत एक फ़ाइल या फ़ोल्डर है। फंक्शन का नाम बदबू आ रही है ... lemme पता है कि क्या आप बेहतर के बारे में सोचते हैं।

/// <summary> 
    /// Copies the source to the dest. Creating any neccessary folders in the destination path as neccessary. 
    /// 
    /// For example: 
    /// Directory Example: 
    /// pSource = C:\somedir\conf and pDest=C:\somedir\backups\USER_TIMESTAMP\somedir\conf 
    /// all files\folders under source will be replicated to destination and any paths in between will be created. 
    /// </summary> 
    /// <param name="pSource">path to file or directory that you want to copy from</param> 
    /// <param name="pDest">path to file or directory that you want to copy to</param> 
    /// <param name="pOverwriteDest">if true, files/directories in pDest will be overwritten.</param> 
    public static void FileCopyWithReplicate(string pSource, string pDest, bool pOverwriteDest) 
    { 
     string destDirectory = Path.GetDirectoryName(pDest); 
     System.IO.Directory.CreateDirectory(destDirectory); 

     if (Directory.Exists(pSource)) 
     { 
      DirectoryCopy(pSource, pDest,pOverwriteDest); 
     } 
     else 
     { 
      File.Copy(pSource, pDest, pOverwriteDest); 
     } 
    } 

    // From MSDN Aricle "How to: Copy Directories" 
    // Link: http://msdn.microsoft.com/en-us/library/bb762914.aspx 
    private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs) 
    { 
     DirectoryInfo dir = new DirectoryInfo(sourceDirName); 
     DirectoryInfo[] dirs = dir.GetDirectories(); 

     if (!dir.Exists) 
     { 
      throw new DirectoryNotFoundException(
       "Source directory does not exist or could not be found: " 
       + sourceDirName); 
     } 

     if (!Directory.Exists(destDirName)) 
     { 
      Directory.CreateDirectory(destDirName); 
     } 

     FileInfo[] files = dir.GetFiles(); 
     foreach (FileInfo file in files) 
     { 
      string temppath = Path.Combine(destDirName, file.Name); 
      file.CopyTo(temppath, true); 
     } 

     if (copySubDirs) 
     { 
      foreach (DirectoryInfo subdir in dirs) 
      { 
       string temppath = Path.Combine(destDirName, subdir.Name); 
       DirectoryCopy(subdir.FullName, temppath, copySubDirs); 
      } 
     } 
    } 
0

प्रश्न के समान, मैं एक गंतव्य से एक फ़ोल्डर संरचना की प्रतिलिपि बना रहा हूं और इसे दूसरे पर डुप्लिकेट कर रहा हूं। पुराने धागे पर पोस्ट करने के लिए खेद है, लेकिन यह किसी के लिए उपयोगी हो सकता है जो यहां समाप्त होता है।

मान लीजिए कि हमारे पास एक ऐसा एप्लिकेशन है जो स्टैंडअलोन है, और हमें फ़ोल्डर फ़ोल्डर को इनपुट फ़ोल्डर से आउटपुट फ़ोल्डर में कॉपी करने की आवश्यकता है। इनपुट फ़ोल्डर और आउटपुट फ़ोल्डर हमारे अनुप्रयोग की मूल निर्देशिका में है।

हम इस तरह (संरचना हम कॉपी करना चाहते हैं) इनपुट फ़ोल्डर के लिए एक DirectoryInfo बना सकते हैं:

DirectoryInfo dirInput = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "\\Input\\"); 

हमारी आउटपुट फ़ोल्डर स्थान एक स्ट्रिंग में संग्रहित किया जा सकता है।

string dirOutput = AppDomain.CurrentDomain.BaseDirectory + "\\Output\\"; 

यह रिकर्सिव विधि हमारे लिए बाकी को संभालना चाहिए।

public static void ProcessDirectories(DirectoryInfo dirInput, string dirOutput) 
    { 
     string dirOutputfix = String.Empty; 

     foreach (DirectoryInfo di in dirInput.GetDirectories()) 
     { 
      dirOutputfix = dirOutput + "\\" + di.Name); 

      if (!Directory.Exists(dirOutputfix)) 
      { 
       try 
       { 
        Directory.CreateDirectory(dirOutputfix); 
       } 
       catch(Exception e) 
       { 
        throw (e); 
       } 
      } 

      ProcessDirectories(di, dirOutputfix); 
     } 
    } 

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

अब हम सिर्फ हमारे dirInput और dirOutput के साथ विधि को कॉल करते हैं।

ProcessDirectories(dirInput, dirOutput); 
+0

वास्तव में उपयोगी है। साझा करने के लिए धन्यवाद । चियर्स –

संबंधित मुद्दे