Переместите все файлы в подпапках в другую папку, используя c # - PullRequest
14 голосов
/ 12 октября 2010

Мой исходный путь - C:\Music\, в котором у меня есть сотни папок с именем Album-1, Album-2 и т. Д.

Я хочу создать папку с именем Consolidated в моем исходном пути,
А затем я хочу переместить все файлы в моих альбомах в папку Consolidated, чтобы я собрал все музыкальные файлы в одну папку.

Как я могу это сделать?

Ответы [ 11 ]

33 голосов
/ 12 октября 2010

Попробуйте вот так

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 будет рекурсивно искать все подпапки.

3 голосов
/ 03 сентября 2012
 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; 
    } 
}
2 голосов
/ 25 января 2012

По сути, это можно сделать с помощью Directory.Move:

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

не вижу причин, почему вы не должны использовать эту функцию. Это рекурсивный и оптимизированный по скорости

2 голосов
/ 12 октября 2010

Вы можете использовать объект 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 );
        }
    }
1 голос
/ 12 октября 2010

Нечто подобное должно заставить вас двигаться. Вам придется добавить проверку ошибок, а что нет (Что, если существует подкаталог источника с именем «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);
}
0 голосов
/ 10 января 2019
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)));
            }
        }
    }

}
0 голосов
/ 19 июля 2018
        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);
            }
        }
0 голосов
/ 11 марта 2017

Вы, вероятно, найдете это полезным для дедупликации ваших 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();
0 голосов
/ 08 апреля 2013

MSDN: msdn.microsoft.com / ru-ru / 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 голосов
/ 12 октября 2010

Возможно, вам будет интересно попробовать Powershell и / или Robocopy для выполнения этой задачи. Это будет намного более кратким, чем создание приложения на C # для этой задачи. Powershell также является отличным инструментом для вашего пояса инструментов для разработки.

Я считаю, что Powershell и Robocopy установлены по умолчанию в Windows Vista и 7.

Это может быть хорошее место для начала: http://technet.microsoft.com/en-us/library/ee332545.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...