2009-12-29 3 views
12

У меня есть папка с 10 текстовыми файлами на диске C: \ TEXTFILES \ на моей машине. Я хочу полностью скопировать папку TEXTFILES и ее содержимое с моей машины на другую машину. Как скопировать то же самое с помощью C#.Копирование папки в C#

+0

Пожалуйста, помогите мне с какой-то пример кода. Поскольку мне нужно скопировать папку с одного сервера на другой сервер – venkat

+0

@sukmar, нет возможности скопировать каталог с использованием одной функции .NET, это из-за безопасности. Вам нужно будет написать свою собственную функцию. См. Мой ответ для деталей. – serhio

+0

.NET может дать нам этот метод «высокого уровня» в рамках. – Seva

ответ

33
using System; 
using System.IO; 

class DirectoryCopyExample 
{ 
    static void Main() 
    { 
     DirectoryCopy(".", @".\temp", true); 
    } 

    private static void DirectoryCopy(
     string sourceDirName, string destDirName, bool copySubDirs) 
    { 
     DirectoryInfo dir = new DirectoryInfo(sourceDirName); 
     DirectoryInfo[] dirs = dir.GetDirectories(); 

     // If the source directory does not exist, throw an exception. 
     if (!dir.Exists) 
     { 
      throw new DirectoryNotFoundException(
       "Source directory does not exist or could not be found: " 
       + sourceDirName); 
     } 

     // If the destination directory does not exist, create it. 
     if (!Directory.Exists(destDirName)) 
     { 
      Directory.CreateDirectory(destDirName); 
     } 


     // Get the file contents of the directory to copy. 
     FileInfo[] files = dir.GetFiles(); 

     foreach (FileInfo file in files) 
     { 
      // Create the path to the new copy of the file. 
      string temppath = Path.Combine(destDirName, file.Name); 

      // Copy the file. 
      file.CopyTo(temppath, false); 
     } 

     // If copySubDirs is true, copy the subdirectories. 
     if (copySubDirs) 
     { 

      foreach (DirectoryInfo subdir in dirs) 
      { 
       // Create the subdirectory. 
       string temppath = Path.Combine(destDirName, subdir.Name); 

       // Copy the subdirectories. 
       DirectoryCopy(subdir.FullName, temppath, copySubDirs); 
      } 
     } 
    } 
} 

От MSDN

+0

Это выглядит прекрасно, если подключены как источник, так и пункт назначения. Но приведенный выше код генерирует исключение, если машина назначения не подключена или может потребоваться подключение учетных данных пользователя. Затем в этом типе сценариев код выше не работает. Есть ли способ преодолеть этот тип исключений, возникающих при передаче файлов с машины на машину. – venkat

+3

Что вы ожидаете от результата, если конечный компьютер не подключен или ожидает, что учетные данные завершат операцию? Я бы подумал, что исключение будет подходящим поведением, если машина назначения недоступна, поскольку я не могу придумать, каким образом заставить пункт назначения быть в сети. Если требуются учетные данные, возможно, появится диалоговое окно для запроса учетных данных. –

+0

Решение не работает, если имеется 2 уровня иерархии папок. Он просто копирует его в базовую папку. – whihathac

-4

Вы найдете все, что вам нужно, в пространстве имен System.IO, а именно классы File и Directory.

+2

-1 не полезно. – toddmo

2
 string path = @"C:\TEXTFILES\"; 
     string path2 = @"P:\myNetworkPath\tesssst"; 

     try 
     { 
      Directory.CreateDirectory(path2); 

      foreach (string fileName in Directory.GetFiles(path)) 
      { 
       File.Copy(
        Path.Combine(path, fileName), 
        Path.Combine(path2, fileName), true); 
      } 
     } 
     catch 
     { 
      Console.WriteLine("Exception"); 
     } 

Для более глубокого копирования, см:

http://www.codeproject.com/KB/files/copydirectoriesrecursive.aspx

9
private void copyDirectory(string strSource, string strDestination) 
{ 
    if (!Directory.Exists(strDestination)) 
    { 
     Directory.CreateDirectory(strDestination); 
    } 

    DirectoryInfo dirInfo = new DirectoryInfo(strSource); 
    FileInfo[] files = dirInfo.GetFiles(); 
    foreach(FileInfo tempfile in files) 
    { 
     tempfile.CopyTo(Path.Combine(strDestination,tempfile.Name)); 
    } 

    DirectoryInfo[] directories = dirInfo.GetDirectories(); 
    foreach(DirectoryInfo tempdir in directories) 
    { 
     copyDirectory(Path.Combine(strSource, tempdir.Name), Path.Combine(strDestination, tempdir.Name)); 
    } 

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