2009-06-07 8 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

は、すでにすべての中間パスを作成しているため、そのまま使用することもできます。

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