将子文件夹中的所有文件移动到另一个文件夹

发布于 2024-09-27 05:18:51 字数 224 浏览 1 评论 0原文

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

我想要做的是创建一个名为 Consolidated 的文件夹> 在我的源路径中。

然后我想将专辑中的所有文件移动到 Consolidated 文件夹中,这样我就可以将所有音乐文件放在一个文件夹中。

我该怎么做?

My source path is C:\Music\ in which I have hundreds of folders called Album-1, Album-2 etc.

What I want to do is create a folder called Consolidated in my source path.

And then I want to move all the files inside my albums to the folder Consolidated, so that I get all the music files in one folder.

How can I do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

倾城°AllureLove 2024-10-04 05:18:52

尝试这样

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

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

Try like this

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

It will get all the files in the "C:\Music" folder (including files in the subfolder) and move them to the destination folder. The SearchOption.AllDirectories will recursively search all the subfolders.

情徒 2024-10-04 05:18:52

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

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

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

Basically, that can be done with Directory.Move:

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

don't see any reason, why you shouldn't use this function. It's recursive and speed optimized

深海夜未眠 2024-10-04 05:18:52

您可以使用 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 );
        }
    }

You can use the Directory object to do this, but you might run into problems if you have the same file name in multiple sub directories (e.g. album1\1.mp3, album2\1.mp3) so you might need a little extra logic to tack something unique onto the names (e.g. 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 );
        }
    }
与君绝 2024-10-04 05:18:52
 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; 
    } 
}
 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; 
    } 
}
遗心遗梦遗幸福 2024-10-04 05:18:52

像这样的事情应该会让你滚动。您必须添加错误检查以及其他内容(如果源代码中有一个名为“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);
}

Something like this should get you rolling. You'll have to add error checking and what not (What if there is a subdirectory of source named "Consolidated"? What if Consolidated already exists? Etc.) This is from memory, so pardon any syntax errors, etc.

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);
}
你是年少的欢喜 2024-10-04 05:18:52
    private static void MoveFiles(string sourceDir, string targetDir)
    {
        IEnumerable<FileInfo> files = Directory.GetFiles(sourceDir).Select(f => new FileInfo(f));
        foreach (var file in files)
        {
            File.Move(file.FullName, Path.Combine(targetDir, file.Name));
        }
    }
    private static void MoveFiles(string sourceDir, string targetDir)
    {
        IEnumerable<FileInfo> files = Directory.GetFiles(sourceDir).Select(f => new FileInfo(f));
        foreach (var file in files)
        {
            File.Move(file.FullName, Path.Combine(targetDir, file.Name));
        }
    }
醉南桥 2024-10-04 05:18:52

我们已经有了用于复制目录结构的变体,因此这只是用于移动的修改版本:

public static void MoveInner(string sourceDirName, string destDirName, bool moveSubDirs)
{
    var dir = new DirectoryInfo(sourceDirName);
    var 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
    var files = dir.GetFiles();

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

        // Move the file.
        file.MoveTo(temppath);
    }

    // If copySubDirs is true, copy the subdirectories
    if (!moveSubDirs)
        return;

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

        // Move the subdirectories
        MoveInner(subdir.FullName, temppath, moveSubDirs: true);
    }
}

We already had variant for copying directory structure, so this is just modified version of it for moving:

public static void MoveInner(string sourceDirName, string destDirName, bool moveSubDirs)
{
    var dir = new DirectoryInfo(sourceDirName);
    var 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
    var files = dir.GetFiles();

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

        // Move the file.
        file.MoveTo(temppath);
    }

    // If copySubDirs is true, copy the subdirectories
    if (!moveSubDirs)
        return;

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

        // Move the subdirectories
        MoveInner(subdir.FullName, temppath, moveSubDirs: true);
    }
}
人心善变 2024-10-04 05:18:52
        String directoryName = @"D:\NewAll\";
        DirectoryInfo dirInfo = new DirectoryInfo(directoryName);
        if (dirInfo.Exists == false)
            Directory.CreateDirectory(directoryName);

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

        List<String> 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);
            }
        }
别想她 2024-10-04 05:18:52

ToCopy值得注意的是,您不能跨卷使用“.move()”方法。
https://learn. microsoft.com/en-us/dotnet/api/system.io.file.move?view=net-6.0
https://learn. microsoft.com/en-us/dotnet/api/system.io.directory.move?view=net-6.0

移动文件:

string DirFrom = @"C:\MyWork";
string DirTo = @"E:\Archive";

DirectoryInfo DirInfoFrom = new DirectoryInfo(DirFrom);
DirectoryInfo DirInfoTo = new DirectoryInfo(DirTo);

if (!DirInfoTo.Exists)
{
    Directory.CreateDirectory(DirTo);
}

foreach (FileInfo FileToCopy in DirInfoFrom.GetFiles())
{
    FileToCopy.CopyTo(DirTo + FileToCopy.Name);
    File.Delete(FileToCopy.FullName);
}

已测试 1/31/22 .NET4.8 VS2019

ToCopyIt is important to mention that you can't use the ".move()" method across volumes.
https://learn.microsoft.com/en-us/dotnet/api/system.io.file.move?view=net-6.0
https://learn.microsoft.com/en-us/dotnet/api/system.io.directory.move?view=net-6.0

Move files:

string DirFrom = @"C:\MyWork";
string DirTo = @"E:\Archive";

DirectoryInfo DirInfoFrom = new DirectoryInfo(DirFrom);
DirectoryInfo DirInfoTo = new DirectoryInfo(DirTo);

if (!DirInfoTo.Exists)
{
    Directory.CreateDirectory(DirTo);
}

foreach (FileInfo FileToCopy in DirInfoFrom.GetFiles())
{
    FileToCopy.CopyTo(DirTo + FileToCopy.Name);
    File.Delete(FileToCopy.FullName);
}

Tested 1/31/22 .NET4.8 VS2019

哆啦不做梦 2024-10-04 05:18:52

使用一个函数调用将所有文件夹(嵌套或非嵌套)包括其文件复制到另一个文件夹(目标)(static void CopyDirectory(string sourceDir, string destinationDir, bool recursive)):

https://learn.microsoft.com/en-us/dotnet/standard/io/how-复制目录

Copy all the folders (nested or not) including their files to another folder (destination) with one function call (static void CopyDirectory(string sourceDir, string destinationDir, bool recursive)):

https://learn.microsoft.com/en-us/dotnet/standard/io/how-to-copy-directories

酒解孤独 2024-10-04 05:18:52

您可能会发现这对于删除文件名不同但标题相同的 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();

You'll probably find this helpful to dedup your mp3's that have a different file name but same title.

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();
烈酒灼喉 2024-10-04 05:18:52

您循环遍历它们,然后只需运行 Move ,Directory 类也具有列出内容的功能iirc。

You loop through them and then simply run Move, the Directory class have functionality for listing contents too iirc.

梦冥 2024-10-04 05:18:52

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

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);
                }
            }
        }
风透绣罗衣 2024-10-04 05:18:52
class Program
{
    static void Main(string[] args)
    {
        movedirfiles(@"E:\f1", @"E:\f2");
    }
    static void movedirfiles(string sourdir,string destdir)
    {
        string[] dirlist = Directory.GetDirectories(sourdir);

        moveallfiles(sourdir, destdir);
        if (dirlist!=null && dirlist.Count()>0)
        {
            foreach(string dir in dirlist)
            {
                string dirName = destdir+"\\"+ new DirectoryInfo(dir).Name;
                Directory.CreateDirectory(dirName);
                moveallfiles(dir,dirName);
            }
        }

    }
    static void moveallfiles(string sourdir,string destdir)
    {
        string[] filelist = Directory.GetFiles(sourdir);
        if (filelist != null && filelist.Count() > 0)
        {
            foreach (string file in filelist)
            {
                File.Copy(file, string.Concat(destdir, "\\"+Path.GetFileName(file)));
            }
        }
    }

}
class Program
{
    static void Main(string[] args)
    {
        movedirfiles(@"E:\f1", @"E:\f2");
    }
    static void movedirfiles(string sourdir,string destdir)
    {
        string[] dirlist = Directory.GetDirectories(sourdir);

        moveallfiles(sourdir, destdir);
        if (dirlist!=null && dirlist.Count()>0)
        {
            foreach(string dir in dirlist)
            {
                string dirName = destdir+"\\"+ new DirectoryInfo(dir).Name;
                Directory.CreateDirectory(dirName);
                moveallfiles(dir,dirName);
            }
        }

    }
    static void moveallfiles(string sourdir,string destdir)
    {
        string[] filelist = Directory.GetFiles(sourdir);
        if (filelist != null && filelist.Count() > 0)
        {
            foreach (string file in filelist)
            {
                File.Copy(file, string.Concat(destdir, "\\"+Path.GetFileName(file)));
            }
        }
    }

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文