簡體   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