2010-12-13 2 views
2

В настоящее время у меня есть 3 словарей:Сравнить 2 словаря с внутренним списком в словарь Diff?

private Dictionary<string, List<string>> oldList = new Dictionary<string, List<string>>(); 
private Dictionary<string, List<string>> newList = new Dictionary<string, List<string>>(); 
private Dictionary<string, List<string>> patchList = new Dictionary<string, List<string>>(); 

oldList и NewList заполнены с каталогом, и все эти подкаталоги и файлы, в которых корень и подкаталоги являются ключом и файлы внутреннего список всех файлов каталог.

код, который используется для заполнения NewList:

private void ProcessDirectory(string targetFolder) 
    { 
     List<string> newInnerList = new List<string>(); 
     newList.Add(targetFolder, newInnerList); 
     newInnerList = newList[targetFolder]; 

     foreach (string file in Directory.GetFiles(targetFolder)) 
      newInnerList.Add(Path.GetFileName(file)); 

     foreach (string dir in Directory.GetDirectories(targetFolder)) 
      ProcessDirectory(dir); 
    } 
  • Это нормально использовать словарь с внутреннем Списком держать эти данные или есть лучший способ это сделать?

Теперь я хочу сравнить newList с oldList и найти, какие файлы были изменены, и какие файлы имеет новый список, который нет в старом списке.

  • Что бы быть лучшим способом для перебора между 2 списками при этом в контрольной суммы файлов для заполнения patchList?
+0

Наверняка есть более простые способы, чтобы сделать резервные копии или синхронизации. –

+0

Ну, чтобы объяснить немного больше, это нужно использовать с xdelta для создания файлов патчей для обновления. – Prix

ответ

6

Истерируйте по папкам и вызовите функцию, передающую два пути и дающие отличия (файлы в A, которые не находятся в B, и файлы в B, который не находится в A и файлы, которые были изменены) в трех отдельных последовательностях.

Другое решение, если вам нравится:

var sourceFiles = Directory.GetFiles(source, "*", SearchOption.AllDirectories).Select(o => o.Replace(source, "")); 
var targetFiles = Directory.GetFiles(target, "*", SearchOption.AllDirectories).Select(o => o.Replace(target, "")); 

var sourceFilesNotInTarget = sourceFiles.Except(targetFiles); 
var targetFilesNotInSource = targetFiles.Except(sourceFiles); 

var changedFiles = sourceFiles.Join(targetFiles, a => CheckSum(a, source), b => CheckSum(b, target), (a, b) => a); 

Question Связанные которые могут быть полезны

+0

+1 Я предполагаю, что я забыл свое решение со списками и забыл, что могу простую итерацию с обоими дирекциями и заполнить patchList напрямую, спасибо, что указали это. – Prix