CopyTo()到一个尚不存在的目录

时间:2009-06-07 02:55:29

标签: c# recursion directory

我想将文件c:\ a1 \ b2 \ c3 \ foo.txt复制到d:\ a1 \ b2 \ c3 \ foo.txt。子驱动器在D驱动器上不存在,如果我尝试直接执行CopyTo(),我将获得IO异常。 我无法找到任何内置的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 个答案:

答案 0 :(得分:8)

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

Documented创建所有必需的目录,并为我工作。

  

指定的任何和所有目录   路径已创建,除非它们已经存在   存在或除非路径的某些部分是   无效。 path参数指定   目录路径,而不是文件路径。如果   这个目录已经存在了   方法什么都不做。

答案 1 :(得分:3)

或者您可以直接使用Directory.CreateDirectory(),因为它已经创建了所有中间路径。

答案 2 :(得分:2)

奇怪,我正在使用 CopyTo ,它会在目标位置自动创建所有子目录。

我的代码很简单:

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

答案 3 :(得分:1)

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