Как скопировать конкретную папку в другую папку? - PullRequest
0 голосов
/ 12 апреля 2019

У меня настоящая проблема, и до сих пор я не мог ее решить. Я использую приложение Visual Studio C # Windows. Я просто хочу скопировать папки «2019» в папку «Source» с именем 20190401, 20190402 и 20190403. В папке «Source» есть случайные папки, такие как «2018», «2017» и другие. Результат, который я хочу получить, - после того, как я нажму кнопку, он автоматически скопирует только папки «2019» в папке «source» в папку «target», и тогда будут скопированы только 3 текстовых файла в папке 2019.

namespace WindowsFormsApplication2
{

    public partial class Form1 : Form

    {
        string FROM_DIR = "C:/Users/5004117928/Desktop/Source";
        string TO_DIR = "C:/Users/5004117928/Desktop/Target/";
        string filename = "t";

        public Form1()
        {
            InitializeComponent();
        }
        private void button_Click(object sender, EventArgs e)
        {  
            DirectoryInfo diCopyForm = new DirectoryInfo(FROM_DIR);
            FileInfo[] fiDiskfiles = diCopyForm.GetFiles();

             foreach (FileInfo newfile in fiDiskfiles.Take(3))
             {
                 try
                 {
                     if (newfile.Name.StartsWith(filename))
                     {
                         File.Copy(newfile.FullName, TO_DIR + newfile.Name);
                     }
                 }
                 catch (Exception ex)
                 {
                     MessageBox.Show(ex.Message);
                 }
             }
        }
    }
}

Ожидается вывод после нажатия кнопки, все папки 2019 будут скопированы в целевая папка с 3 текстовыми файлами внутри каждой папки 2019, которая была скопирована.

1 Ответ

0 голосов
/ 12 апреля 2019

Давайте реализуем процедуру шаг за шагом:

  using System.IO;
  using System.Linq;

  ... 

  // "I just want to copy "2019" folders in " Source" 
  string FROM_DIR = "C:/Users/5004117928/Desktop/Source";

  // "with given name 20190401, 20190402, and 20190403"
  HashSet<string> acceptedFiles = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
    "20190401", "20190402", "20190403"
  };

  // "I want is after I click a button then it automatically only "2019" folders"
  // Here we enumerate all files to copy:
  //   - they are from FROM_DIR, 2019 subfolder
  //   - they are in acceptedFiles ("20190401", "20190402", "20190403")
  var files = Directory
    .EnumerateFiles(Path.Combine(FROM_DIR, "2019"), "*", SearchOption.TopDirectoryOnly)
    .Where(file => acceptedFiles.Contains(Path.GetFileNameWithoutExtension(file)))
    .ToArray();

  // will copy to "target" folder 
  string TO_DIR = "C:/Users/5004117928/Desktop/Target";

  // Copy:
  foreach (var sourceFile in files) {
    // for given sourceFile we change its folder
    string targetFile = Path.Combine(TO_DIR, Path.GetFileName(sourceFile));

    File.Copy(sourceFile, targetFile);
  }

Редактировать: Если у вас есть много каталогов на выбор, давайте перечислим их и добавим Where:

  var files = Directory
    .EnumerateDirectories(FROM_DIR, "*", SearchOption.TopDirectoryOnly)
    .Where(dir => new DirectoryInfo(dir).Name.StartsWith("2019"))
    .SelectMany(dir => Directory
       .EnumerateFiles(dir, "*")
       .Where(file => acceptedFiles.Contains(Path.GetFileNameWithoutExtension(file))))
    .ToArray();

  ...
...