CopyTo () в каталог, который еще не существует - PullRequest
2 голосов
/ 07 июня 2009

Я хочу скопировать файл c: \ a1 \ b2 \ c3 \ foo.txt в d: \ a1 \ b2 \ c3 \ foo.txt. Подкаталоги не существуют на диске D, и если я попытаюсь выполнить прямое CopyTo (), я получу исключение ввода-вывода. Я не смог найти ни одной встроенной функции C #, которая делает грязную работу по созданию отсутствующих каталогов. Итак, я написал это:

FileInfo file = new FileInfo(@"c:\a1\b2\c3\foo.txt");
DirectoryInfo destDir = new DirectoryInfo(file.DirectoryName.Replace("c:", "d:");

if (!destDir.Exists) // false
    CreateDirectory(destDir, null);
file.CopyTo(file.FullName.Replace("c:", "d:"), true);

private void CreateDirectory(DirectoryInfo endDir, Stack<DirectoryInfo> trail)
{
    if (trail == null)
    {
        trail = new Stack<DirectoryInfo>();
        trail.Push(endDir);
    }

    // remove last directory - c:\a1\b2\c3, c:\a1\b2, c:\a1
    Match theMatch = Regex.Match(endDir.FullName, @".*(?=\\\w*\Z)"); 
    DirectoryInfo checkDir = new DirectoryInfo(theMatch.ToString());
    if (!checkDir.Exists)
    {
        trail.Push(checkDir);
        CreateDirectory(checkDir, trail);
    }
    else
        foreach (DirectoryInfo dir in trail)
            Directory.CreateDirectory(dir.FullName);
}

Это довольно сложно, и, как они любят говорить в ночных рекламных роликах: «Должен быть лучший путь!

Вопрос: как бы мне сделать приведенную выше функцию эффективной? И мне не хватает встроенного метода, который уже делает все, что я делаю трудным путем?

Ответы [ 4 ]

8 голосов
/ 07 июня 2009
Directory.CreateDirectory(@"c:\foo\bar\baz");

Документировано как создание всех необходимых каталогов и работает для меня.

Любые и все каталоги, указанные в пути созданы, если они уже существуют или если какая-то часть пути недействительным. Параметр path указывает путь к каталогу, а не путь к файлу. Если каталог уже существует, это метод ничего не делает.

3 голосов
/ 07 июня 2009

Или вы можете просто использовать Directory.CreateDirectory() напрямую, поскольку он уже создает все промежуточные пути.

2 голосов
/ 10 июня 2014

Странно, я работаю с CopyTo , и он автоматически создает все подкаталоги в месте назначения.

Мой код настолько прост, насколько может быть:

// file is FileInfo and target is DirectoryInfo
file.CopyTo(target);
1 голос
/ 13 июля 2015

A DirectoryInfo экземпляр может создать свой собственный путь со всеми необходимыми проверками с помощью destDir.Create():

FileInfo file = new FileInfo(@"c:\a1\b2\c3\foo.txt");
DirectoryInfo destDir = new DirectoryInfo(file.DirectoryName.Replace("c:", "d:");

destDir.Create(); // <-- makes it if it doesn't exist, otherwise noop

var newPath = 
   Path.Combine(destDir.FullName, Path.GetFileName(file)); // <-- just to be safe...
file.CopyTo(newPath, true);

Обнаружил это здесь: https://stackoverflow.com/a/2955425/1037948

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...