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