使用c#将子文件夹中的所有文件移动到另一个文件夹

我的源路径是C:\Music\ ,其中我有数百个名为Album-1,Album-2等的文件夹。

我想要做的是在我的源路径中创建一个名为Consolidated的文件夹。
然后我想将我的相册中的所有文件移动到文件夹Consolidated ,以便我将所有音乐文件放在一个文件夹中。

我怎样才能做到这一点 ?

试试这样吧

 String directoryName = "C:\\Consolidated"; DirectoryInfo dirInfo = new DirectoryInfo(directoryName); if (dirInfo.Exists == false) Directory.CreateDirectory(directoryName); List 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); } } 

它将获取“C:\ Music”文件夹中的所有文件(包括子文件夹中的文件)并将它们移动到目标文件夹。 SearchOption.AllDirectories将递归搜索所有子文件夹。

  public void MoveDirectory(string[] source, string target) { var stack = new Stack(); 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; } } 

您可以使用Directory对象执行此操作,但如果您在多个子目录中具有相同的文件名(例如album1 \ 1.mp3,album2 \ 1.mp3),则可能会遇到问题,因此您可能需要一些额外的逻辑来在名称上添加一些独特的东西(例如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 ); } } 

基本上,可以使用Directory.Move完成:

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

没有看到任何理由,为什么你不应该使用这个function。 它是递归和速度优化的

像这样的东西应该让你滚动。 你必须添加错误检查和什么不是(如果有一个名为“Consolidated”的源的子目录怎么办?如果Consolidated已经存在怎么办?等等。这是来自内存,所以请原谅任何语法错误等。

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

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

您可能会发现这有助于重复删除具有不同文件名但标题相同的mp3。

源自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(); 
  String directoryName = @"D:\NewAll\"; DirectoryInfo dirInfo = new DirectoryInfo(directoryName); if (dirInfo.Exists == false) Directory.CreateDirectory(directoryName); List AllFiles= Directory .GetFiles(@"D:\SourceDirectory\", "*.*", SearchOption.AllDirectories).ToList(); foreach (string file in AllFiles) { FileInfo mFile = new FileInfo(file); // to remove name collisions if (new FileInfo(dirInfo + "\\" + mFile.Name).Exists == false) { mFile.MoveTo(dirInfo + "\\" + mFile.Name); } else { string s = mFile.Name.Substring(0, mFile.Name.LastIndexOf('.')); int a = 0; while (new FileInfo(dirInfo + "\\" + s + a.ToString() + mFile.Extension).Exists) { a++; } mFile.MoveTo(dirInfo + "\\" + s + a.ToString() + mFile.Extension); } } 

你遍历它们然后只需运行Move ,Directory类也具有列出内容的functioniirc。

您可能有兴趣尝试使用Powershell和/或Robocopy来完成此任务。 它比为任务创建C#应用程序要简洁得多。 Powershell也是开发工具带的绝佳工具。

我相信在Windows Vista和7上默认安装Powershell和Robocopy。

这可能是一个很好的起点: http : //technet.microsoft.com/en-us/library/ee332545.aspx