2010-10-12 19 views
11

मेरे स्रोत पथ C:\Music\ जिसमें मैं फ़ोल्डर्स एल्बम -1 कहा जाता है के सैकड़ों है, एल्बम -2 आदि हैग # का उपयोग कर किसी अन्य फ़ोल्डर में सबफ़ोल्डर में सभी फ़ाइलों को ले जाएँ

मुझे क्या करना चाहते हैं एक फ़ोल्डर Consolidated बनाएं जिसका नाम है मेरे स्रोत पथ में।
और फिर मैं अपने एल्बम के अंदर सभी फ़ाइलों को फ़ोल्डर Consolidated पर ले जाना चाहता हूं, ताकि मुझे सभी संगीत फ़ाइलों को एक फ़ोल्डर में मिल सके।

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

+0

... http://msdn.microsoft.com/en-us/library/cc148994(v=vs.90).aspx – SteveC

उत्तर

25

इस

String directoryName = "C:\\Consolidated"; 
DirectoryInfo dirInfo = new DirectoryInfo(directoryName); 
if (dirInfo.Exists == false) 
    Directory.CreateDirectory(directoryName); 

List<String> MyMusicFiles = Directory 
        .GetFiles("C:\\Music", "*.*", SearchOption.AllDirectories).ToList(); 

foreach (string file in MyMusicFiles) 
{ 
    FileInfo mFile = new FileInfo(file); 
    // to remove name collisions 
    if (new FileInfo(dirInfo + "\\" + mFile.Name).Exists == false) 
    { 
     mFile.MoveTo(dirInfo + "\\" + mFile.Name); 
    } 
} 

तरह की कोशिश करो यह में सभी फाइलों मिल जाएगा: (सबफ़ोल्डर में फ़ाइलों सहित) फ़ोल्डर और उन्हें गंतव्य फ़ोल्डर में ले जाने के "सी \ संगीत"। SearchOption.AllDirectories सभी उपफोल्डर्स को फिर से खोजेगा।

+0

फ़ाइल मिलीभगत क्या है पर बाहर MSDN पेज चेक? – gonzobrains

+1

@gonzobrains और कोई और - मुझे पूरा यकीन है कि टिप्पणी 'नाम * टकराव * हटाने के लिए' होना चाहिए। –

+5

फाइलें अवैध रूप से हमारे जीवन को कठिन बनाने के लिए निर्देशिकाओं के साथ षड्यंत्रकारी करती हैं - यह फाइल संलयन है ;-) – rmirabelle

-1

आप उनके माध्यम से लूप करते हैं और फिर बस Move चलाते हैं, निर्देशिका वर्ग में सामग्री को सूचीबद्ध करने की कार्यक्षमता भी iirc है।

1

ऐसा कुछ आपको रोलिंग करना चाहिए। आपको त्रुटि जांच और क्या नहीं करना होगा (क्या होगा यदि "समेकित" नामक स्रोत का उपनिर्देशिका है? क्या होगा यदि समेकित पहले से मौजूद है? आदि) यह स्मृति से है, इसलिए किसी भी वाक्यविन्यास त्रुटियों को क्षमा करें,

string source = @"C:\Music"; 
string[] directories = Directory.GetDirectories(source); 
string consolidated = Path.Combine(source, "Consolidated") 
Directory.CreateDirectory(consolidated); 
foreach(var directory in directories) { 
    Directory.Move(directory, consolidated); 
} 
-1

आपको इस कार्य को करने के लिए पावरहेल और/या रोबोकॉपी को आजमाने में रुचि हो सकती है। यह कार्य के लिए एक सी # आवेदन बनाने से बहुत अधिक संक्षिप्त होगा। पावरहेल आपके विकास उपकरण-बेल्ट के लिए भी एक अच्छा टूल है।

मेरा मानना ​​है कि Powershell और लड़ी दोनों Windows Vista पर डिफ़ॉल्ट रूप से स्थापित कर रहे हैं और 7.

यह एक अच्छी जगह शुरू हो सकता है किया जाना है: http://technet.microsoft.com/en-us/library/ee332545.aspx

2

ऐसा करने के लिए निर्देशिका वस्तु का उपयोग कर सकते हैं, लेकिन आप यदि आपके पास एकाधिक उप निर्देशिकाओं (जैसे album1 \ 1.mp3, album2 \ 1.mp3) में एक ही फ़ाइल नाम है तो समस्याएं हो सकती हैं ताकि आपको नामों पर अद्वितीय कुछ करने के लिए थोड़ा अतिरिक्त तर्क की आवश्यकता हो (जैसे एल्बम 1-1। mp4)।

public void CopyDir(string sourceFolder, string destFolder) 
    { 
     if (!Directory.Exists(destFolder)) 
      Directory.CreateDirectory(destFolder); 

     // Get Files & Copy 
     string[] files = Directory.GetFiles(sourceFolder); 
     foreach (string file in files) 
     { 
      string name = Path.GetFileName(file); 

      // ADD Unique File Name Check to Below!!!! 
      string dest = Path.Combine(destFolder, name); 
      File.Copy(file, dest); 
     } 

     // Get dirs recursively and copy files 
     string[] folders = Directory.GetDirectories(sourceFolder); 
     foreach (string folder in folders) 
     { 
      string name = Path.GetFileName(folder); 
      string dest = Path.Combine(destFolder, name); 
      CopyDir(folder, dest); 
     } 
    } 
1

असल में, कि Directory.Move साथ किया जा सकता:

   try 
       { 
        Directory.Move(source, destination); 
       } 
       catch { } 

, किसी भी कारण नहीं दिख रहा है यही कारण है कि आप इस सुविधा का उपयोग नहीं करना चाहिए। यह पुनरावर्ती है और गति के लिए अनुकूलित

+0

क्या होगा यदि गंतव्य निर्देशिका पहले से मौजूद है? आपको 'डायरेक्टरी' को कॉल करने से पहले (Move.Delete (गंतव्य, सत्य) 'करने पर विचार करना चाहिए, यदि यह सफल है, तो' Move ' – Andy

3
public void MoveDirectory(string[] source, string target) 
    { 
     var stack = new Stack<Folders>(); 
     stack.Push(new Folders(source[0], target)); 
     while (stack.Count > 0) 
     { 
      var folders = stack.Pop(); 
      Directory.CreateDirectory(folders.Target); 
      foreach (var file in Directory.GetFiles(folders.Source, "*.*")) 
      { 
       string targetFile = Path.Combine(folders.Target, Path.GetFileName(file)); 
       if (File.Exists(targetFile)) File.Delete(targetFile); File.Move(file, targetFile); 
      } 
      foreach (var folder in Directory.GetDirectories(folders.Source)) 
      { 
       stack.Push(new Folders(folder, Path.Combine(folders.Target, Path.GetFileName(folder)))); 
      } 
     } 
     Directory.Delete(source[0], true); 
    } 
} 


public class Folders { 
    public string Source { 
     get; private set; 
    } 
    public string Target { 
     get; private set; 
    } 
    public Folders(string source, string target) { 
     Source = source; 
     Target = target; 
    } 
} 
0

MSDN: msdn.microsoft.com/en-us/library/bb762914.aspx

private void DirectoryCopy(
      string sourceDirName, string destDirName, bool copySubDirs) 
     { 
      DirectoryInfo dir = new DirectoryInfo(sourceDirName); 
      DirectoryInfo[] dirs = dir.GetDirectories(); 

      // If the source directory does not exist, throw an exception. 
      if (!dir.Exists) 
      { 
       throw new DirectoryNotFoundException(
        "Source directory does not exist or could not be found: " 
        + sourceDirName); 
      } 

      // If the destination directory does not exist, create it. 
      if (!Directory.Exists(destDirName)) 
      { 
       Directory.CreateDirectory(destDirName); 
      } 


      // Get the file contents of the directory to copy. 
      FileInfo[] files = dir.GetFiles(); 

      foreach (FileInfo file in files) 
      { 
       // Create the path to the new copy of the file. 
       string temppath = Path.Combine(destDirName, file.Name); 

       // Copy the file. 
       file.CopyTo(temppath, false); 
      } 

      // If copySubDirs is true, copy the subdirectories. 
      if (copySubDirs) 
      { 

       foreach (DirectoryInfo subdir in dirs) 
       { 
        // Create the subdirectory. 
        string temppath = Path.Combine(destDirName, subdir.Name); 

        // Copy the subdirectories. 
        DirectoryCopy(subdir.FullName, temppath, copySubDirs); 
       } 
      } 
     } 
+0

पर कॉल करें ऐसा लगता है कि इसे सीधे एमएसडीएन से लिया गया था। http://msdn.microsoft.com/en-us/library/bb762914.aspx जब आप दूसरों से कोड लेते हैं तो कृपया स्रोत का संदर्भ लें। – denver

+0

@denver - किया। मैं आम तौर पर संदर्भ डालता हूं जैसे http://stackoverflow.com/a/15880280/1060656 – dekdev

0

आप शायद एक अलग फ़ाइल नाम, लेकिन एक ही शीर्षक है कि आपके एमपी 3 के dedup को यह उपयोगी मिल जाएगा।

source from David @ msdn!

byte[] b = new byte[128]; 
string sTitle; 
string sSinger; 
string sAlbum; 
string sYear; 
string sComm; 
FileStream fs = new FileStream(file, FileMode.Open); 
fs.Seek(-128, SeekOrigin.End); 
fs.Read(b, 0, 128); 
bool isSet = false; 
String sFlag = System.Text.Encoding.Default.GetString(b, 0, 3); 
if (sFlag.CompareTo("TAG") == 0) 
{ 
System.Console.WriteLine("Tag   is   setted! "); 
isSet = true; 
} 
if (isSet) 
{ 
//get   title   of   song; 
sTitle = System.Text.Encoding.Default.GetString(b, 3, 30); 
System.Console.WriteLine("Title: " + sTitle); 
//get   singer; 
sSinger = System.Text.Encoding.Default.GetString(b, 33, 30); 
System.Console.WriteLine("Singer: " + sSinger); 
//get   album; 
sAlbum = System.Text.Encoding.Default.GetString(b, 63, 30); 
System.Console.WriteLine("Album: " + sAlbum); 
//get   Year   of   publish; 
sYear = System.Text.Encoding.Default.GetString(b, 93, 4); 
System.Console.WriteLine("Year: " + sYear); 
//get   Comment; 
sComm = System.Text.Encoding.Default.GetString(b, 97, 30); 
System.Console.WriteLine("Comment: " + sComm); 
} 
System.Console.WriteLine("Any   key   to   exit! "); 
System.Console.Read(); 
+0

स्टैक ओवरव्लो में आपका स्वागत है। यह पोस्ट प्रश्न का उत्तर नहीं है, जो b.t.w. पहले से ही काफी अच्छा जवाब दिया गया है। मूल प्रश्न पर विस्तृत करने के लिए उत्तर का उपयोग न करें। –

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

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