2009-06-07 2 views
3

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

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

Это довольно активное участие, и как они любят говорить о полуночных informercials,

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

ответ

6
Directory.CreateDirectory(@"c:\foo\bar\baz"); 

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

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

+0

Наверное, это значит, что я слишком занят. Благодаря! Вот чего я боялся :) – Drakestar

2

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

1

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

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

// file is FileInfo and target is DirectoryInfo 
file.CopyTo(target); 
0

DirectoryInfo экземпляр может create its own path со всеми проверки вы хотите через 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

Смежные вопросы