我正在创建一个程序,当我需要它时会创建我的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
内的文件以及其中的目录和文件。< / 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
内的所有目录并复制所有文件?
答案 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}
通过这种方式,您可以获得一个空间更少的克隆,它将占用更少的空间,并且复制速度尽可能快。
只需从备份中克隆即可恢复。