С# - Функция для репликации структуры папок в пути к файлу
Мне нужна простая функция, которая будет принимать в качестве входного файла FileInfo и destination_directory_name, получить путь к файлу из файлаinfo и реплицировать его в файле destination_directory_name, переданном как второй параметр.
для ex. filepath - "d:\recordings\location1\client1\job1\file1.ext
функция должна создавать каталоги в файле destination_directory_name, если они не существуют и скопировать файл после создания каталогов.
Ответы
Ответ 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);