[英]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.