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

时间:2010-10-12 03:59:33

标签: c# directory

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

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

我该怎么做?

12 个答案:

答案 0 :(得分:33)

试试这个

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将递归搜索所有子文件夹。

答案 1 :(得分: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; 
    } 
}

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

这样的事情应该让你滚动。你必须添加错误检查和什么不是(如果有一个名为“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);
}

答案 5 :(得分:1)

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

答案 6 :(得分: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);
                }
            }
        }

答案 7 :(得分:0)

您可能会发现这对于重复播放具有不同文件名但标题相同的mp3很有帮助。

source from David @ msdn

    /// <summary>
    /// This is a helper property for setting the Translation SelectedIndex
    /// </summary>
    private int TranslationIndex
    {
        get
        {
            return cmb_Translation.SelectedIndex;
        }
        set
        {
            cmb_Translation.SelectedIndex = value;
        }
    }

    /// <summary>
    /// This is a helper property for setting the Book SelectedIndex
    /// </summary>
    private int BookIndex
    {
        get
        {
            return cmb_Book.SelectedIndex;
        }
        set
        {
            cmb_Book.SelectedIndex = value;
        }
    }

    /// <summary>
    /// This is a helper property for setting the Chapter SelectedIndex
    /// </summary>
    private int ChapterIndex
    {
        get
        {
            return cmb_Chapter.SelectedIndex;
        }
        set
        {
            cmb_Chapter.SelectedIndex = value;
        }
    }

    /// <summary>
    /// Retrieves the currently selected Chapter listing
    /// </summary>
    public IEnumerable<ChapterIndex> CurrentChapters
    {
        get
        {
            return from c in dataLoader.Translations[TranslationIndex].Books[BookIndex].Chapters select new ChapterIndex { Index = c.Index };
        }
    }

    /// <summary>
    /// Retrieves Genesis in the first loaded translation
    /// </summary>
    public IEnumerable<ChapterIndex> Genesis
    {
        get
        {
            return from c in dataLoader.Translations[0].Books[0].Chapters select new ChapterIndex { Index = c.Index };
        }
    }

    public IEnumerable<BookNames> CurrentBooks
    {
        get
        {
            return from b in dataLoader.Translations[TranslationIndex].Books select new BookNames { BookName = b.BookName };
        }
    }

    /// <summary>
    /// Allows events to process on ComboBoxes and Back/Forward Buttons
    /// to change Chapters, you usually don't want to do this lots of
    /// times in one second if changing the Translation/Book/Chapter
    /// all at one time so you may set it to false first, update your
    /// variables, and then set it back to true so updating events will
    /// process correctly.
    /// </summary>
    public bool UpdateChapterText { get; set; }

    /// <summary>
    /// The DataLoader object loads up the various Bible translation texts
    /// </summary>
    TheBible.Model.DataLoader.DataLoader dataLoader;

    public MainPage()
    {
        this.InitializeComponent();
        dataLoader = new Model.DataLoader.DataLoader();
        dataLoader.Completed += DataLoader_Completed;
        ApplicationView.GetForCurrentView().TryEnterFullScreenMode();
    }

    private void DataLoader_Completed(object sender, EventArgs e)
    {
        UpdateChapterText = false;
        cmb_Translation.ItemsSource = from t in dataLoader.Translations select new { t.TranslationShortName };
        cmb_Book.ItemsSource = from b in dataLoader.Translations[0].Books select new { b.BookName };
        cmb_Chapter.ItemsSource = Genesis;
        cmb_Translation.SelectedIndex = 0;
        cmb_Book.SelectedIndex = 0;
        UpdateChapterText = true;
        cmb_Chapter.SelectedIndex = 0;
    }

    private void translationChanged()
    {
        chapterChanged();
    }

    private void bookChanged()
    {
        UpdateChapterText = false;
        cmb_Chapter.ItemsSource = CurrentChapters;
        UpdateChapterText = true;
        cmb_Chapter.SelectedIndex = 0;
    }

    private void chapterChanged()
    {
        textBlock_Verses.Text = dataLoader.Translations[TranslationIndex].Books[BookIndex].Chapters[ChapterIndex].TextLineSeparated;
    }

    private void decrementChapter()
    {
        UpdateChapterText = false;
        if (this.cmb_Chapter.SelectedIndex == 0)
        {
            if (this.cmb_Book.SelectedIndex > 0)
            {
                this.cmb_Book.SelectedIndex--;
                UpdateChapterText = true;
                this.cmb_Chapter.SelectedIndex = CurrentChapters.Count() - 1;
            }
        }
        else
        {
            UpdateChapterText = true;
            this.cmb_Chapter.SelectedIndex--;
        }
        UpdateChapterText = true;
    }

    private void incrementChapter()
    {
        UpdateChapterText = false;
        if (this.cmb_Chapter.SelectedIndex == this.cmb_Chapter.Items.Count - 1)
        {
            if (this.cmb_Book.SelectedIndex < this.cmb_Book.Items.Count - 1)
            {
                this.cmb_Book.SelectedIndex++;
                UpdateChapterText = true;
                this.cmb_Chapter.SelectedIndex = 0;
            }
        }
        else
        {
            UpdateChapterText = true;
            this.cmb_Chapter.SelectedIndex++;
        }
        UpdateChapterText = true;
    }

    private void cmb_Translation_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (UpdateChapterText)
            translationChanged();
    }

    private void cmb_Book_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (UpdateChapterText)
            bookChanged();
    }

    private void cmb_Chapter_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (UpdateChapterText)
            chapterChanged();
    }

    private void btn_Forward_Click(object sender, RoutedEventArgs e)
    {
        incrementChapter();
    }

    private void btn_Back_Click(object sender, RoutedEventArgs e)
    {
        decrementChapter();
    }

    private void btn_FullScreen_Click(object sender, RoutedEventArgs e)
    {
        var view = ApplicationView.GetForCurrentView();
        if (view.IsFullScreenMode)
        {
            sym_FullScreen.Symbol = Symbol.FullScreen;
            view.ExitFullScreenMode();
        }
        else
        {
            sym_FullScreen.Symbol = Symbol.BackToWindow;
            view.TryEnterFullScreenMode();
        }
    }

答案 8 :(得分:0)

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

答案 9 :(得分:-1)

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

答案 10 :(得分:-1)

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

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

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

答案 11 :(得分:-1)

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

}