Recursivley将目录内的文件复制到另一个目录中。

时间:2016-06-02 22:49:19

标签: c# loops directory

我正在创建一个程序,当我需要它时会创建我的git项目的备份,并且我试图复制一个目录中的所有文件,以及目录,目录中的所有文件。但是,当我运行此程序时,它只复制起始目录中的文件,例如我有这个目录:

$ ls
email/

在该目录的内部,我有这些文件和目录:

$ ls
gen_email.rb*  lib/  LICENSE.txt  log/  readme.md

lib内有

email/  list.yml  modules/  tools/

log内有

email_log.LOG

现在我需要能够复制此目录中的文件,以及liblog内的文件以及其中的目录和文件。< / p>

当我运行此程序时,我得到以下内容:

'06-02-2016 fl2knjas.z24'/

其中包括:

gen_email.rb*  LICENSE.txt  readme.md

所以我的程序正在做它的工作,是的,但它遗漏了一些目录和文件..

来源:

using System;
using System.IO;

namespace BackupGen
{ 
    class Program
    {
        static void Copy(string strtDir, string destDir)
        {
            foreach (var file in Directory.GetFiles(strtDir))
                File.Copy(file, Path.Combine(destDir, Path.GetFileName(file)));

            foreach (var directory in Directory.GetDirectories(strtDir))
                Copy(directory, Path.Combine(destDir, Path.GetFileName(directory)));
        }

        static void Main(string[] args)
        {
            var date = DateTime.Now.ToString("MM-dd-yyyy");
            var fileName = Path.GetRandomFileName();


            var dir = Directory.CreateDirectory($"{date} {fileName}");

            Console.WriteLine("Attempting to create a backup..");
            try
            {
                Directory.CreateDirectory($@"Z:\backups\{dir}");
                Copy(@"C:\Users\git_orgin\email", $@"Z:\backups\{dir}");
                Console.WriteLine($"Backup created as {dir}");
                Console.ReadLine();
            }
            catch (Exception e)
            {
                Console.WriteLine("Something went wrong.. {0}", e.ToString());
            }

        }
    }
}

问题是,我怎样才能让它继续遍历strtDir内的所有目录并复制所有文件?

2 个答案:

答案 0 :(得分:2)

这是一个经典的树问题(如二叉树)。在某些时候,你必须在函数中写入递归,这是一个调用自身的函数。类似的东西:

public List<string> GetFiles(string folder)
{
    List<string> allFilesPaths = new List<string>();
    string[] allSubDirectories = System.IO.Directory.GetDirectories();
    for(int i = 0;i<allSubDirectories.Length; i++)
    {
       //you may need to format this path a bit but this is the magic of 
      //recursion, its calling itself!
       List<string> subfiles = GetFiles(folder + allSubDirectories[i]); 
       allFilesPaths.AddRange(subfiles);
    }
    string[] allFiles = System.IO.Directory.GetFiles(folder);
    //You may need to append the entire path onto each file if you want
    allFilesPaths.AddRange(allFiles);
    return allFilesPaths;
}
Main()
{
   string RootDirectoryPath = "...";
   List<string> allFilesPaths = GetFiles(RootDirectoryPath );
   //copy each file one by one
}

答案 1 :(得分:2)

如果你真的想要备份git档案,我建议你为此调用git自己的函数。

onChange={this.handleCheck}

通过这种方式,您可以获得一个空间更少的克隆,它将占用更少的空间,并且复制速度尽可能快。

只需从备份中克隆即可恢复。