2014-12-07 2 views
3

(Source) 한 폴더에서 모든 파일을 다른 폴더 (Destination)으로 복사해야합니다. 또한 두 폴더의 내용이 이름과 정확히 일치하는 경우 두 폴더를 비교하고 100에서 멈추는 카운터를 증가시켜야합니다.두 개의 다른 폴더에서 파일을 비교하고 조건부 복사 수행

각 파일의 크기와 이름을 비교할 필요가 없습니다.

이것은 내가 시도했지만 위에서 설명한대로 원하는 결과를 얻지 못합니다.

여기 자원의 일부를 참조하고 있습니다 : http://msdn.microsoft.com/en-us/library/bb546137.aspx

class Program 
{ 
    class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo> 
    { 
     public FileCompare() { } 

     public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2) 
     { 
      return (f1.Name == f2.Name && 
        f1.Length == f2.Length); 
     } 
     public int GetHashCode(System.IO.FileInfo fi) 
     { 
      string s = String.Format("{0}{1}", fi.Name, fi.Length); 
      return s.GetHashCode(); 
     } 
    } 

    static void Main(string[] args) 
    { 

     int i = 1; 

     string sourcePath = @"C:\Users\Administrator\Desktop\Source"; 
     string destinationPath = @"C:\Users\Administrator\Desktop\Dest"; 

     string fileName = System.IO.Path.GetFileName(sourcePath); 

     string source = System.IO.Path.Combine(sourcePath, fileName); 
     string destination = System.IO.Path.Combine(destinationPath, fileName); 

     System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(sourcePath); 
     System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(destinationPath); 

     IEnumerable<System.IO.FileInfo> list1 = dir1.GetFiles("*.*", 
     System.IO.SearchOption.AllDirectories); 

     IEnumerable<System.IO.FileInfo> list2 = dir2.GetFiles("*.*", 
     System.IO.SearchOption.AllDirectories); 


     string[] files = System.IO.Directory.GetFiles(sourcePath); 

     foreach (string s in files) 
     { 
      fileName = System.IO.Path.GetFileName(s); 
      destination = System.IO.Path.Combine(destinationPath, fileName); 
      System.IO.File.Copy(s, destination, true); 

      FileCompare myFileCompare = new FileCompare(); 
      bool areIdentical = list1.SequenceEqual(list2, myFileCompare); 

      while (areIdentical != true) 
      { 
       Console.WriteLine(i++); 
      } 

     } 

     Console.WriteLine("Press any key to exit."); 
     Console.ReadKey(); 
    } 
} 
+0

너무 가깝습니다. "그러나 나는 위에서 기술 된 바대로 욕망 결과를 얻지 못한다."- 그러나 당신이 얻는 결과는 무엇이며, 이것은 당신이 원했던 것과는 어떻게 다른가? –

+0

나는 가까이에 있는지 확신하지 못한다. :) 증분이 작동하지 않습니다 및 while 루프를 사용하여 부울 평가 문제가 있습니다. 위 코드를 실행하면 무한 루프가 발생하며 비교 부분이 작동하지 않는 것처럼 보입니다. – Asynchronous

+0

나는 그 질문이 완벽하게 "너무 가까이"제시되었다는 것을 의미했다. 그러나 그것은 몇몇 특성을 놓치고있다; 당신은 사람들이 그 세부 사항을 제공한다면 좋은 대답을 제공하는 것을 도울 수 있습니다. 무슨 일이 일어나고, 어떻게 일어나고 싶었는지 다른 점을 자세히 설명하십시오. –

답변

7

당신은 두 디렉토리를 동기화,이 솔루션을 시도 할 수 있습니다.

class Program 
{ 
    class FileCompare : System.Collections.Generic.IEqualityComparer<System.IO.FileInfo> 
    { 
     public bool Equals(System.IO.FileInfo f1, System.IO.FileInfo f2) 
     { 
      return (f1.Name == f2.Name); 
     } 
     public int GetHashCode(System.IO.FileInfo fi) 
     { 
      string s = fi.Name; 
      return s.GetHashCode(); 
     } 
    } 

    static void Main(string[] args) 
    { 
     string sourcePath = @"C:\Users\Administrator\Desktop\Source"; 
     string destinationPath = @"C:\Users\Administrator\Desktop\Dest"; 

     System.IO.DirectoryInfo dir1 = new System.IO.DirectoryInfo(sourcePath); 
     System.IO.DirectoryInfo dir2 = new System.IO.DirectoryInfo(destinationPath); 

     IEnumerable<System.IO.FileInfo> list1 = dir1.GetFiles("*.*", 
     System.IO.SearchOption.AllDirectories); 

     IEnumerable<System.IO.FileInfo> list2 = dir2.GetFiles("*.*", 
     System.IO.SearchOption.AllDirectories); 

     bool IsInDestination = false; 
     bool IsInSource = false; 

     foreach (System.IO.FileInfo s in list1) 
     { 
      IsInDestination = true; 

      foreach (System.IO.FileInfo s2 in list2) 
      { 
       if (s.Name == s2.Name) 
       { 
        IsInDestination = true; 
        break; 
       } 
       else 
       { 
        IsInDestination = false; 
       } 
      } 

      if (!IsInDestination) 
      { 
       System.IO.File.Copy(s.FullName, System.IO.Path.Combine(destinationPath, s.Name), true); 
      } 
     } 

     list1 = dir1.GetFiles("*.*", System.IO.SearchOption.AllDirectories); 

     list2 = dir2.GetFiles("*.*", System.IO.SearchOption.AllDirectories); 

     bool areIdentical = list1.SequenceEqual(list2, new FileCompare()); 

     if (!areIdentical) 
     { 
      foreach (System.IO.FileInfo s in list2) 
      { 
       IsInSource = true; 

       foreach (System.IO.FileInfo s2 in list1) 
       { 
        if (s.Name == s2.Name) 
        { 
         IsInSource = true; 
         break; 
        } 
        else 
        { 
         IsInSource = false; 
        } 
       } 

       if (!IsInSource) 
       { 
        System.IO.File.Copy(s.FullName, System.IO.Path.Combine(sourcePath, s.Name), true); 
       } 
      } 
     } 

     Console.WriteLine("Press any key to exit."); 
     Console.ReadKey(); 
    } 
} 
관련 문제