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

Anu*_*uya 15 c# directory

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

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

我怎样才能做到这一点 ?

Tho*_*eld 34

试试这样吧

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 非法密谋与目录密谋的文件让我们的生活变得困难 - 这是文件勾结;-) (10认同)
  • 重要的是,这不会保留子文件夹结构。可以通过在循环内将 mFile.Name 替换为 mFile.FullName.Substring(directoryName.TrimEnd('\\').Length+1) 来调整。 (3认同)

Zac*_*ary 7

您可以使用 Directory 对象来执行此操作,但如果您在多个子目录(例如专辑 1\1.mp3、专辑 2\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 );
        }
    }
Run Code Online (Sandbox Code Playgroud)


Ars*_*ray 5

基本上,这可以通过 Directory.Move 来完成:

                try
                {
                    Directory.Move(source, destination);
                }
                catch { }
Run Code Online (Sandbox Code Playgroud)

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

  • 如果目标目录已经存在怎么办?您应该考虑(在调用“Move”之前)执行“Directory.Delete(destination, true)”,如果成功,则调用“Move” (2认同)