c # - Функция для репликации структуры папок в пути к файлу - PullRequest
17 голосов
/ 13 января 2009

Мне нужна простая функция, которая будет принимать FileInfo и destination_directory_name в качестве входных данных, получать путь к файлу из fileinfo и копировать его в destination_directory_name, передаваемом в качестве второго параметра.

например путь к файлу "d: \ recordss \ location1 \ client1 \ job1 \ file1.ext" функция должна создать каталоги в destination_directory_name, если они не существуют, и скопировать файл после создания каталогов.

Ответы [ 4 ]

48 голосов
/ 18 июля 2009

System.IO.Directory.CreateDirectory может использоваться для создания окончательного каталога, а также автоматически создает все папки в пути, если они не существуют.

//Will create all three directories (if they do not already exist).
System.IO.Directory.CreateDirectory("C:\\First\\Second\\Third")
32 голосов
/ 13 января 2009

Я использую для этой цели следующий метод:

public static void CreateDirectory(DirectoryInfo directory)
{
    if (!directory.Parent.Exists)
        CreateDirectory(directory.Parent);
    directory.Create();
}

Используйте это следующим образом:

// path is your file path
string directory = Path.GetDirectoryName(path);
CreateDirectory(new DirectoryInfo(directory));
3 голосов
/ 06 сентября 2012

На основе ответа @ NTDLS вот метод, который будет реплицировать источник в пункт назначения. Он обрабатывает случай, когда источником является файл или папка. Название функции вроде воняет ... позвольте мне знать, если вы думаете о лучшем.

    /// <summary>
    /// Copies the source to the dest.  Creating any neccessary folders in the destination path as neccessary.
    /// 
    /// For example:
    /// Directory Example:
    /// pSource = C:\somedir\conf and pDest=C:\somedir\backups\USER_TIMESTAMP\somedir\conf   
    /// all files\folders under source will be replicated to destination and any paths in between will be created.
    /// </summary>
    /// <param name="pSource">path to file or directory that you want to copy from</param>
    /// <param name="pDest">path to file or directory that you want to copy to</param>
    /// <param name="pOverwriteDest">if true, files/directories in pDest will be overwritten.</param>
    public static void FileCopyWithReplicate(string pSource, string pDest, bool pOverwriteDest)
    {
        string destDirectory = Path.GetDirectoryName(pDest);
        System.IO.Directory.CreateDirectory(destDirectory);

        if (Directory.Exists(pSource))
        {
            DirectoryCopy(pSource, pDest,pOverwriteDest);
        }
        else
        {
            File.Copy(pSource, pDest, pOverwriteDest);
        }
    }

    // From MSDN Aricle "How to: Copy Directories"
    // Link: http://msdn.microsoft.com/en-us/library/bb762914.aspx
    private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs)
    {
        DirectoryInfo dir = new DirectoryInfo(sourceDirName);
        DirectoryInfo[] dirs = dir.GetDirectories();

        if (!dir.Exists)
        {
            throw new DirectoryNotFoundException(
                "Source directory does not exist or could not be found: "
                + sourceDirName);
        }

        if (!Directory.Exists(destDirName))
        {
            Directory.CreateDirectory(destDirName);
        }

        FileInfo[] files = dir.GetFiles();
        foreach (FileInfo file in files)
        {
            string temppath = Path.Combine(destDirName, file.Name);
            file.CopyTo(temppath, true);
        }

        if (copySubDirs)
        {
            foreach (DirectoryInfo subdir in dirs)
            {
                string temppath = Path.Combine(destDirName, subdir.Name);
                DirectoryCopy(subdir.FullName, temppath, copySubDirs);
            }
        }
    }
0 голосов
/ 18 февраля 2015

Аналогично вопросу, я копирую структуру папок из одного места назначения и дублирую ее в другое. Извините за публикацию в старой ветке, но это может быть полезно для кого-то, кто попал сюда.

Давайте предположим, что у нас есть отдельное приложение, и нам нужно скопировать структуру папок из папки Input в папку Output. Папка Input и папка Output находятся в корневом каталоге нашего приложения.

Мы можем сделать DirectoryInfo для папки Input (структура, которую мы хотим скопировать) следующим образом:

DirectoryInfo dirInput = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "\\Input\\");

Расположение нашей выходной папки может быть сохранено в виде строки.

string dirOutput = AppDomain.CurrentDomain.BaseDirectory + "\\Output\\";

Этот рекурсивный метод должен обрабатывать все остальное для нас.

    public static void ProcessDirectories(DirectoryInfo dirInput, string dirOutput)
    {
        string dirOutputfix = String.Empty;

        foreach (DirectoryInfo di in dirInput.GetDirectories())
        {
            dirOutputfix = dirOutput + "\\" + di.Name);

            if (!Directory.Exists(dirOutputfix))
            {
                try
                {
                    Directory.CreateDirectory(dirOutputfix);
                }
                catch(Exception e)
                {
                    throw (e);
                }
            }

            ProcessDirectories(di, dirOutputfix);
        }
    }

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

Теперь мы просто вызываем метод с нашими dirInput и dirOutput.

ProcessDirectories(dirInput, dirOutput); 
...