2013-04-26 3 views
3

하나의 디렉토리에서 다른 디렉토리로 파일을 복사 할 수있는 this solution on MSDN이 있지만 하위 디렉토리가 아닌 기본 디렉토리에서만 복사됩니다.디렉토리와 그 내용을 비동기 복사

이 솔루션을 수정하여 모든 폴더와 해당 내용을 복사 할 수 있습니까?

string StartDirectory = @"C:\Users\..."; 
string EndDirectory = @"C:\Users\...."; 

//Creates all of the directories and sub-directories 
foreach (string dirPath in Directory.GetDirectories(StartDirectory, "*", SearchOption.AllDirectories)) 
    Directory.CreateDirectory(dirPath.Replace(StartDirectory, EndDirectory)); 

foreach (string filename in Directory.EnumerateFiles(StartDirectory)) 
{ 
     using (FileStream SourceStream = File.Open(filename, FileMode.Open)) 
     { 
      using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\')))) 
      { 
        await SourceStream.CopyToAsync(DestinationStream); 
       } 
     } 
} 

답변

1

는 두 개의 루프, 하위 디렉토리 (첫 번째) 모두를위한 하나의 주요 디렉토리 하나를 해결 // 내가 .cubeupload.com/cDENbF.jpg
5

내부 루프를 둘러싸 기 위해 첫 번째 루프를 확장하면 제대로 작동합니다. for 루프는 처음으로 모든 폴더를 검색하지만 최상위 폴더의 파일 만 열거합니다. 각 하위 폴더의 파일도 열거해야합니다. 또한 DirectoryInfo는이 경우 Directory보다 더 쉽게 작업 할 수 있습니다.

foreach (string dirPath in Directory.GetDirectories(StartDirectory, "*", SearchOption.AllDirectories)) 
      { 
       Directory.CreateDirectory(dirPath.Replace(StartDirectory, EndDirectory)); 
       foreach (string filename in Directory.EnumerateFiles(dirPath)) 
       { 
        using (FileStream SourceStream = File.Open(filename, FileMode.Open)) 
        { 
         using (FileStream DestinationStream = File.Create(filename.Replace(StartDirectory, EndDirectory))) 
         { 

          await SourceStream.CopyToAsync(DestinationStream); 

         } 
        } 
       } 
      } 

      foreach (string filename in Directory.EnumerateFiles(StartDirectory)) 
      { 
       using (FileStream SourceStream = File.Open(filename, FileMode.Open)) 
       { 
        using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\')))) 
        { 

         await SourceStream.CopyToAsync(DestinationStream); 
        } 
       } 
      } 
+0

코드가 나에게 두 가지 오류를 제공합니다 : HTTP를 :

DirectoryInfo StartDirectory = new DirectoryInfo(@"C:\Users\..."); DirectoryInfo EndDirectory = new DirectoryInfo(@"C:\Users\...."); //Creates all of the directories and sub-directories foreach (DirectoryInfo dirInfo in StartDirectory.GetDirectories("*", SearchOption.AllDirectories)) { string dirPath = dirInfo.FullName; string outputPath = dirPath.Replace(StartDirectory.FullName, EndDirectory.FullName); Directory.CreateDirectory(outputPath); foreach (FileInfo file in dirInfo.EnumerateFiles()) { using (FileStream SourceStream = file.OpenRead()) { using (FileStream DestinationStream = File.Create(outputPath + file.Name)) { SourceStream.CopyToAsync(DestinationStream); } } } } 
AlonMln

+0

@ AlonMln - 지금 당신을 위해 더 잘 작동 할 것으로 업데이트되었습니다. 나는 정적 인 파일과 디렉토리에 대해 잊어 버렸다. FileInfo와 DirectoryInfo는 훨씬 더 많은 컨트롤과 객체 지향적 인 기능을 제공하므로 항상 사용합니다. 보시다시피, 구문을 약간 다르게 만듭니다. 이것은 여전히 ​​조금 더 깨끗하게 할 수 있지만 그것이 내 생각에 도움이 될 것입니다. –

관련 문제