繁体   English   中英

在一个目录内,另一个目录内,递归复制文件。

[英]Recursivley copy files inside of a directory, inside of another directory.

我正在创建一个程序,该程序将在需要时创建git项目的备份,并尝试复制一个目录内的所有文件以及目录,目录内的所有文件。 但是,当我运行该程序时,它仅复制起始目录中的文件,例如,我具有以下目录:

$ ls
email/

在该目录中,我具有以下文件和目录:

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

lib里面我有

email/  list.yml  modules/  tools/

log里面我有

email_log.LOG

现在,我需要能够复制此目录中的文件以及lib的文件,并与其中的目录和文件一起进行log

当我运行该程序时,我得到以下信息:

'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内部的所有目录中继续运行并复制所有文件?

这是经典的树问题(如二叉树)。 在某些时候,您必须将递归写入函数中,该函数是一个自调用的函数。 就像是:

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
}

如果您确实要备份git归档文件,建议您为此调用git自己的函数。

git copy source-path target-path

这样,您将获得一个裸露的仓库克隆副本,它将占用更少的空间,并且副本将尽可能快。

您只需从备份中克隆即可还原。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM