2014-11-07 6 views
0

Я пытаюсь скопировать один каталог на другой путь.
Я нашел этот метод, но он не копирует каталог, только поддиректории и файлы внутри него:Копировать каталог со всеми файлами и папками

string sourcedirectory = Environment.ExpandEnvironmentVariables("%AppData%\\Program"); 

foreach (string dirPath in Directory.GetDirectories(sourcedirectory, "*", SearchOption.AllDirectories)) 
{ 
    Directory.CreateDirectory(dirPath.Replace(sourcedirectory, folderDialog.SelectedPath)); 
} 
foreach (string newPath in Directory.GetFiles(sourcedirectory, "*.*", SearchOption.AllDirectories)) 
{ 
    File.Copy(newPath, newPath.Replace(sourcedirectory, folderDialog.SelectedPath), true); 
} 

Как я могу получить папку «Program» на выходе со всеми файлами и подпапок ?

+0

Что вы имеете в виду «это не скопировать каталог "? Он, очевидно, копирует сам каталог - он не сможет скопировать подкаталоги и файлы, если каталог верхнего уровня не присутствовал в выводе. Вы имеете в виду, что он не копирует файлы в каталог верхнего уровня? Кажется, это похоже, просто сканирование кода. (Лично я предпочитаю рекурсивное решение, вместо того, чтобы полагаться на 'string.Replace()' или на другую манипуляцию, но код здесь выглядит достаточно разумным). –

+0

@PeterDuniho Каталог «Программа» не создан, но файлы и папки внутри него копируются в пункт назначения. Мне нужно получить каталог «Программа» на выходе. – DotNet

+0

Я считаю, что это дублированный вопрос. Посмотрите на решение MSDN этого вопроса (я думаю, что это последнее) - он должен скопировать все, включая сам каталог. [Копировать каталог C#] (http://stackoverflow.com/questions/58744/best-way-to-copy-the-entire-contents-of-a-directory-in-c-sharp) –

ответ

0

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

string sourcedirectory = Environment.ExpandEnvironmentVariables("%AppData%\\Program"); 

folderDialog.SelectedPath = Path.Combine(folderDialog.SelectedPath, 
    Path.GetFileName(sourcedirectory)); 

foreach (string dirPath in Directory.GetDirectories(sourcedirectory, "*", SearchOption.AllDirectories)) 
{ 
    Directory.CreateDirectory(dirPath.Replace(sourcedirectory, folderDialog.SelectedPath)); 
} 
foreach (string newPath in Directory.GetFiles(sourcedirectory, "*.*", SearchOption.AllDirectories)) 
{ 
    File.Copy(newPath, newPath.Replace(sourcedirectory, folderDialog.SelectedPath), true); 
} 
0

Вы можете использовать рекурсивную функцию, чтобы сделать это:

private void button1_Click(object sender, EventArgs e) 
    { 
     this.CopyAll(new DirectoryInfo(@"D:\Original"), new DirectoryInfo(@"D:\Copy")); 
    } 
    private void CopyAll(DirectoryInfo oOriginal, DirectoryInfo oFinal) 
    { 
     foreach (DirectoryInfo oFolder in oOriginal.GetDirectories()) 
      this.CopyAll(oFolder, oFinal.CreateSubdirectory(oFolder.Name)); 

     foreach (FileInfo oFile in oOriginal.GetFiles()) 
      oFile.CopyTo(oFinal.FullName + @"\" + oFile.Name, true); 
    } 
Смежные вопросы