я получил этот код MSDN, но все еще не могу заставить мою программу работать с ним - PullRequest
0 голосов
/ 04 февраля 2011

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

{
    string SelectedPath = (string)e.Argument;
    string sourceDirName;
    string destDirName;
    bool copySubDirs;
    DirectoryCopy(".", SelectedPath, true);

  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);
        }
    }
}                

любая помощь будет оценена

Ответы [ 4 ]

2 голосов
/ 04 февраля 2011

Не существует готового метода для копирования каталогов.Лучшее, что вы можете сделать, это использовать методы расширения.Посмотрите на это - http://channel9.msdn.com/Forums/TechOff/257490-How-Copy-directories-in-C/07964d767cc94c3990bb9dfa008a52c8

Вот полный пример (только что протестировал, и он работает):

using System;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var di = new DirectoryInfo("C:\\SomeFolder");
            di.CopyTo("E:\\SomeFolder", true);
        }
    }

public static class DirectoryInfoExtensions
{
    // Copies all files from one directory to another.
    public static void CopyTo(this DirectoryInfo source, string destDirectory, bool recursive)
    {
        if (source == null)
            throw new ArgumentNullException("source");
        if (destDirectory == null)
            throw new ArgumentNullException("destDirectory");

        // If the source doesn't exist, we have to throw an exception.
        if (!source.Exists)
            throw new DirectoryNotFoundException("Source directory not found: " + source.FullName);
        // Compile the target.
        DirectoryInfo target = new DirectoryInfo(destDirectory);
        // If the target doesn't exist, we create it.
        if (!target.Exists)
            target.Create();

        // Get all files and copy them over.
        foreach (FileInfo file in source.GetFiles())
        {
            file.CopyTo(Path.Combine(target.FullName, file.Name), true);
        }

        // Return if no recursive call is required.
        if (!recursive)
            return;

        // Do the same for all sub directories.
        foreach (DirectoryInfo directory in source.GetDirectories())
        {
            CopyTo(directory, Path.Combine(target.FullName, directory.Name), recursive);
        }
    }
}

}

1 голос
/ 04 февраля 2011

Может быть, попытаться увидеть, существует ли путь перед копией. Если его там нет, тогда создайте его?

string folderPath = Path.GetDirectoryName(path);
if (!Directory.Exists(folderPath))
    Directory.CreateDirectory(folderPath);
1 голос
/ 04 февраля 2011
0 голосов
/ 04 февраля 2011

Умный способ сделать это, как в ответе нитин.Используя ваш подход, вы можете использовать информацию FileInfo.Directory, чтобы определить источник файла, а затем создать этот каталог в месте назначения, если это необходимо.Но ссылка нитинс является более чистым решением.

...