Скопировать папки в С# с помощью System.IO

Вопрос:Мне нужно скопировать папку C:FromFolder в C:ToFolder Ниже приведен код, который будет СМЕНАТЬ мой FromFolder, а затем создаст мой ToFolder. Таким образом, мой FromFolder исчезнет, ​​и все элементы будут во вновь созданной папке с именем ToFolder System.IO.Directory.Move(@"C:FromFolder ", @"C:ToFolder"); Но я просто хочу скопировать файлы в FromFolder в ToFolder. По какой-то причине нет System.IO.Directory.Copy??? Как

Вопрос:

Мне нужно скопировать папку C:FromFolder в C:ToFolder

Ниже приведен код, который будет СМЕНАТЬ мой FromFolder, а затем создаст мой ToFolder.
Таким образом, мой FromFolder исчезнет, ​​и все элементы будут во вновь созданной папке с именем ToFolder

System.IO.Directory.Move(@»C:FromFolder «, @»C:ToFolder»);

Но я просто хочу скопировать файлы в FromFolder в ToFolder.
По какой-то причине нет System.IO.Directory.Copy???

Как это делается с помощью пакетного файла – Очень легко

xcopy C:FromFolder C:ToFolder

Отношения
Etienne

Лучший ответ:

Эта ссылка является хорошим примером.

http://msdn.microsoft.com/en-us/library/cc148994.aspx

Вот фрагмент

// To copy all the files in one directory to another directory. // Get the files in the source folder. (To recursively iterate through // all subfolders under the current directory, see // «How to: Iterate Through a Directory Tree.») // Note: Check for target path was performed previously // in this code example. if (System.IO.Directory.Exists(sourcePath)) { string[] files = System.IO.Directory.GetFiles(sourcePath); // Copy the files and overwrite destination files if they already exist. foreach (string s in files) { // Use static Path methods to extract only the file name from the path. fileName = System.IO.Path.GetFileName(s); destFile = System.IO.Path.Combine(targetPath, fileName); System.IO.File.Copy(s, destFile, true); } } Ответ №1

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

static void Main(string[] args) { DirectoryInfo sourceDir = new DirectoryInfo(«c:\a»); DirectoryInfo destinationDir = new DirectoryInfo(«c:\b»); CopyDirectory(sourceDir, destinationDir); } static void CopyDirectory(DirectoryInfo source, DirectoryInfo destination) { if (!destination.Exists) { destination.Create(); } // Copy all files. FileInfo[] files = source.GetFiles(); foreach (FileInfo file in files) { file.CopyTo(Path.Combine(destination.FullName, file.Name)); } // Process subdirectories. DirectoryInfo[] dirs = source.GetDirectories(); foreach (DirectoryInfo dir in dirs) { // Get destination directory. string destinationDir = Path.Combine(destination.FullName, dir.Name); // Call CopyDirectory() recursively. CopyDirectory(dir, new DirectoryInfo(destinationDir)); } } Ответ №2

Копирование каталогов (правильно) на самом деле является довольно сложной задачей, особенно если вы учитываете передовые методы файловой системы, такие как переходы и жесткие ссылки. Лучше всего использовать API, который его поддерживает. Если вы не боитесь немного P/Invoke, SHFileOperation в shell32 – ваш лучший выбор. Другой альтернативой может быть использование метода Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory в сборке Microsoft.VisualBasic(даже если вы не используете VB).

Ответ №3

да, вы правы.

http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx

предоставил функцию копирования.
или вы можете использовать другую функцию

http://msdn.microsoft.com/en-us/library/ms127960.aspx

Ответ №4

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

string[] files = Directory.GetFiles(GlobalVariables.mstrReadsWellinPath); foreach(string s in files) { fileName=Path.GetFileName(s); destFile = Path.Combine(DestinationPath, fileName); File.Copy(s, destFile); }

Я оставляю вам каталог назначения: -)

Ответ №5

Ты прав. Не существует метода Directory.Copy. Это был бы очень мощный метод, но также и опасный, для ничего не подозревающего разработчика. Копирование папки может быть очень трудоемкой, при перемещении одной (на одном диске) нет.

Я предполагаю, что Microsoft подумала, что будет делать копию файла по файлу, поэтому вы можете показать какую-то информацию о ходе. Вы можете перебирать файлы в каталоге, создавая экземпляр DirectoryInfo, а затем вызываете GetFiles(). Чтобы также включить подкаталоги, вы также можете вызвать GetDirectories() и перечислить их с помощью рекурсивного метода.

Ответ №6

В этой статье предлагается alogirthm для копирования рекурсивно некоторой папки и всего ее содержимого

Из статьи:

К сожалению, в System.IO нет встроенной функции, которая копирует папку и ее содержимое. Ниже приведен простой рекурсивный алгоритм, который копирует папку, ее подпапки и файлы, при необходимости создавая папку назначения. Для простоты нет обработки ошибок; исключение будет бросать, если что-то пойдет не так, например, пустые или недействительные пути или если файлы назначения уже существуют.

Удачи!

Ответ №7

Простая функция, которая копирует все содержимое исходной папки в папку назначения и создает целевую папку, если она не существует

class Utils { internal static void copy_dir(string source, string dest) { if (String.IsNullOrEmpty(source) || String.IsNullOrEmpty(dest)) return; Directory.CreateDirectory(dest); foreach (string fn in Directory.GetFiles(source)) { File.Copy(fn, Path.Combine(dest, Path.GetFileName(fn)), true); } foreach (string dir_fn in Directory.GetDirectories(source)) { copy_dir(dir_fn, Path.Combine(dest, Path.GetFileName(dir_fn))); } } } Ответ №8

Моя версия DirectoryInfo.CopyTo с использованием расширения.

public static class DirectoryInfoEx { public static void CopyTo(this DirectoryInfo source, DirectoryInfo target) { if (source.FullName.ToLower() == target.FullName.ToLower()) return; if (!target.Exists) target.Create(); foreach (FileInfo f in source.GetFiles()) { FileInfo newFile = new FileInfo(Path.Combine(target.FullName, f.Name)); f.CopyTo(newFile.FullName, true); } foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) { DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name); diSourceSubDir.CopyTo(nextTargetSubDir); } } }

И используйте вот так…

DirectoryInfo d = new DirectoryInfo(«C:Docs»); d.CopyTo(new DirectoryInfo(«C:New»)); Ответ №9

Этот код позволяет пользователю копировать содержимое одного каталога в другой.

using System; using System.IO; // … static void Main(string[] args) { Console.ForegroundColor = ConsoleColor.Cyan; Console.Write(«Copying… «); DeepCopy(@»C:Books», @»D:Books»); Console.WriteLine(«Completed»); Console.ForegroundColor = ConsoleColor.Gray; Console.Write(«Press any key to quit . . . «); Console.ReadKey(true); } static void DeepCopy(string destination, string source) { Directory.CreateDirectory(destination); string[] files = Directory.GetFiles(source); foreach (string filepath in files) { int fileindex = filepath.LastIndexOf(‘\’); string filename = filepath.Substring(fileindex); Copy(destination + filename, filepath); } string[] directories = Directory.GetDirectories(source); foreach (string directory in directories) { int subdirindex = directory.LastIndexOf(‘\’); string subdirname = directory.Substring(subdirindex); string structure = destination + subdirname; DeepCopy(structure, directory); } } static void Copy(string destination, string source, bool overwrite = false) { if (overwrite == true) if (File.Exists(destination)) File.Delete(destination); if (File.Exists(destination)) return; using (Stream filereader = File.OpenRead(source)) using (Stream filewriter = File.OpenWrite(destination)) { int readlength = 0; byte[] buffer = new byte[1048576]; while (filereader.Length != filewriter.Length) { readlength = filereader.Read(buffer, 0, 1048576); filewriter.Write(buffer, 0, readlength); } } }

Оцените статью
Добавить комментарий