2016-06-02 2 views
0

Я создаю программу, которая будет создавать резервные копии моего проекта git, когда они мне понадобятся, и пытаюсь скопировать все файлы внутри одного каталога вместе со всеми файлами, находящимися внутри каталогов, каталогов. Однако, когда я запускаю эту программу, она только копирует, что файлы, которые находятся внутри исходного каталога, например, у меня есть этот каталог:Recursivley копирует файлы внутри каталога, внутри другого каталога.

$ 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([email protected]"Z:\backups\{dir}"); 
       Copy(@"C:\Users\git_orgin\email", [email protected]"Z:\backups\{dir}"); 
       Console.WriteLine($"Backup created as {dir}"); 
       Console.ReadLine(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Something went wrong.. {0}", e.ToString()); 
      } 

     } 
    } 
} 

Вопрос, как я могу заставить это продолжить работу по всем каталогам, внутри strtDir и скопировать все файлы?

+0

Что случилось с 'System.Diagnostics.Process.Start()' для запуска команды xcopy, которая уже может рекурсивно копировать файлы? –

+0

@EricJ. : Может быть, он хочет реализовать свою собственную систему отчетности о прогрессе? :) –

+0

Отличное упражнение, но если колесо уже существует, я хотел бы указать его :-) –

ответ

2

Если вы действительно хотите, чтобы сделать резервную копию архива мерзавца Я предлагаю вам назвать свою функцию Git и для этого.

git copy source-path target-path 

Таким образом, вы получаете голой репозиторий, который займет меньше места, и копия будет такой же быстрой, как и может быть.

Вы восстанавливаете путем простого клонирования из резервной копии.

+0

Хм, не знал об этом. Это может сработать, спасибо. – 13aal

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 
} 
+0

Это похоже на то, что можно немного убить скорость процесса, но мне это нравится, и посмотреть, как это может творить чудеса. – 13aal

Смежные вопросы