2010-10-12 8 views
11

mio percorso di origine è C:\Music\ in cui ho centinaia di cartelle chiamate Album-1, Album-2 eccSpostare tutti i file in sottocartelle in un'altra cartella utilizzando C#

Quello che voglio fare è creare una cartella chiamata Consolidated nel mio percorso di origine.
E poi voglio spostare tutti i file all'interno dei miei album nella cartella Consolidated, in modo da ottenere tutti i file musicali in una cartella.

Come posso fare questo?

+0

controllare la pagina MSDN all'indirizzo ... http://msdn.microsoft.com/en-us/library/cc148994(v=vs.90).aspx – SteveC

risposta

25

Prova come questo

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

Si otterrà tutti i file nella cartella "C: \ Music" cartella (inclusi i file nella sottocartella) e spostarli nella cartella di destinazione. Lo SearchOption.AllDirectories ricercherà ricorsivamente tutte le sottocartelle.

+0

che cosa è il file di collusione? – gonzobrains

+1

@gonzobrains e chiunque altro - Sono abbastanza sicuro che il commento dovrebbe essere 'per rimuovere nome * collisioni *'. –

+5

I file illegalmente cospirano con le directory per rendere le nostre vite difficili - questa è la collusione dei file ;-) – rmirabelle

-1

Si passano attraverso di essi e quindi si esegue semplicemente Move, la classe Directory ha funzionalità per elencare anche i contenuti iirc.

1

Qualcosa di simile dovrebbe farti rotolare. Dovrai aggiungere la verifica degli errori e cosa no (Che cosa succede se esiste una sottodirectory di origine "Consolidata"? Cosa succede se Consolidated esiste già? Etc.) Questo è dalla memoria, quindi scusami eventuali errori di sintassi, ecc.

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

Potresti essere interessato a provare Powershell e/o Robocopy per eseguire questa operazione. Sarà molto più conciso rispetto alla creazione di un'applicazione C# per l'attività. Powershell è anche un ottimo strumento per il tuo strumento di sviluppo.

Credo Powershell e Robocopy siano entrambi installati di default su Windows Vista e 7.

Questo potrebbe essere un buon punto di partenza: http://technet.microsoft.com/en-us/library/ee332545.aspx

2

È possibile utilizzare l'oggetto Directory per fare questo, ma è potrebbe incorrere in problemi se si ha lo stesso nome di file in più sottodirectory (ad esempio album1 \ 1.mp3, album2 \ 1.mp3), quindi potrebbe essere necessario un po 'di logica aggiuntiva per aggiungere qualcosa di unico ai nomi (ad esempio album1-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

In sostanza, che può essere fatto con Directory.Move:

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

non vedono alcuna ragione, perché non si dovrebbe usare questa funzione. E 'ricorsivo e la velocità ottimizzata

+0

Cosa succede se la directory di destinazione esiste già? Dovresti considerare (prima di chiamare 'Move') per fare un' Directory.Delete (destination, true) ', se questo ha successo, allora chiama' 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

Questo sembra che sia stato preso direttamente da MSDN. http://msdn.microsoft.com/en-us/library/bb762914.aspx Si prega di fare riferimento alla fonte quando si prende il codice dagli altri. – denver

+0

@denver - done. Generalmente inserisco i riferimenti, ad esempio http://stackoverflow.com/a/15880280/1060656 – dekdev

0

Probabilmente troverete questo utile DeDup tuoi mp3 che hanno un nome di file diverso, ma stesso titolo.

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

Benvenuti in StackOverflow. Questo post non è una risposta alla domanda, che b.t.w. è già stato risposto abbastanza bene. Si prega di non utilizzare le risposte per elaborare la domanda originale. –

Problemi correlati