2014-12-07 4 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

Я просто имел в виду, что вопрос был представлен «так близко» к совершенно (что редко встречается здесь на SO). Но в нем отсутствуют некоторые особенности; вы можете помочь людям в предоставлении хороших ответов, если вы предоставите эти детали. Пожалуйста, подробно расскажите, что происходит и как это отличается от того, что вы хотели. –

ответ

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

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

  • Нет связанных вопросов^_^