2010-10-12 7 views
11

Moja droga źródłem jest C:\Music\ w których mam setki folderów zwanych Album-1, Album-2 itpPrzenieś wszystkie pliki w podfolderach do innego folderu przy użyciu C#

Co chcę zrobić, to stworzyć folder o nazwie Consolidated w mojej ścieżce źródłowej.
A następnie chcę przenieść wszystkie pliki wewnątrz moich albumów do folderu Consolidated, aby uzyskać wszystkie pliki muzyczne w jednym folderze.

Jak mogę to zrobić?

+0

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

Odpowiedz

25

Spróbuj jak to

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

Będzie się wszystkie pliki w folderze „C: \ Music” folderu (w tym pliki w podfolderze) i przenieść je do folderu docelowego. SearchOption.AllDirectories będzie rekurencyjnie wyszukiwał wszystkie podfoldery.

+0

co jest plik zmowa? – gonzobrains

+1

@gonzobrains i ktokolwiek inny - jestem prawie pewny, że komentarzem powinno być 'remove name * collisions *'. –

+5

Pliki nielegalnie spisujące się w katalogach, aby nasze życie było trudne - to zmowa plików ;-) – rmirabelle

-1

Przeszukujesz je, a następnie po prostu uruchamiasz Move, klasa Katalog ma również funkcję wyświetlania zawartości iirc.

1

Coś takiego powinno Cię przetoczyć. Będziesz musiał dodać sprawdzanie błędów, a co nie (Co jeśli istnieje podkatalog źródła o nazwie "Konsolidowane"? Co jeśli Konsolidacja już istnieje? Etc.) To jest z pamięci, więc przebacz wszelkie błędy składni, itp.

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

Możesz być zainteresowany wypróbowaniem Powershell i/lub Robocopy, aby wykonać to zadanie. Będzie to o wiele bardziej zwięzłe niż tworzenie aplikacji C# dla zadania. Powershell jest również doskonałym narzędziem do paska narzędzi programowania.

wierzę PowerShell i Robocopy są zarówno instalowany domyślnie w systemie Windows Vista i 7.

To może być dobrym miejscem do rozpoczęcia: http://technet.microsoft.com/en-us/library/ee332545.aspx

2

Można użyć obiektu Directory, aby to zrobić, ale ty może napotkać problemy, jeśli masz taką samą nazwę pliku w wielu podkatalogach (np. album1 \ 1.mp3, album2 \ 1.mp3), więc możesz potrzebować trochę dodatkowej logiki, aby zaimportować coś wyjątkowego do nazw (np. 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

zasadzie, że można zrobić z Directory.Move:

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

nie widzę żadnego powodu, dlaczego nie powinno się używać tej funkcji. To rekurencyjne i prędkości zoptymalizowany

+0

Co, jeśli katalog docelowy już istnieje? Powinieneś rozważyć (przed wywołaniem 'Move'), aby wykonać polecenie' Directory.Delete (miejsce docelowe, true) ', jeśli to się powiedzie, następnie wywołaj' 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

Wygląda na to, że zostało pobrane bezpośrednio z MSDN. http://msdn.microsoft.com/en-us/library/bb762914.aspx W przypadku pobierania kodu od innych osób należy odwoływać się do źródła. – denver

+0

@denver - gotowe. generalnie umieszczam referencje np. http://stackoverflow.com/a/15880280/1060656 – dekdev

0

Prawdopodobnie okaże się to pomocne dedup swoje mp3, które mają inną nazwę pliku, ale sam tytuł.

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

Witamy w StackOverflow. Ten post nie jest odpowiedzią na pytanie, które b.t.w. zostało już dość dobrze odebrane. Proszę nie używać odpowiedzi do opracowania oryginalnego pytania. –

Powiązane problemy