Подтвердить что ты не робот

С# - Функция для репликации структуры папок в пути к файлу

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

//Will create all three directories (if they do not already exist).
System.IO.Directory.CreateDirectory("C:\\First\\Second\\Third")

Ответ 3

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

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

Ответ 4

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

Предположим, что у нас есть приложение, которое является автономным, и нам нужно скопировать структуру папок из папки ввода в папку "Вывод". Папка ввода и папка "Выход" находятся в корневом каталоге нашего приложения.

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

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