Найти новый файл в двух папках с перекрестной проверкой

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

как-то линия

pf.NFile = !( oldPatch.FindAll(s => s.Equals(f)).Count() == 0);

всегда возвращает ложь. что-то не так с моей логикой перекрестной проверки?

List<string> newPatch = DirectorySearch(_newFolder);
List<string> oldPatch = DirectorySearch(_oldFolder);

foreach (string f in newPatch)
{
    string filename = Path.GetFileName(f);
    string Dir = (Path.GetDirectoryName(f).Replace(_newFolder, "") + @"\");
    PatchFile pf = new PatchFile();
    pf.Dir = Dir;
    pf.FName = filename;
    pf.NFile = !( oldPatch.FindAll(s => s.Equals(f)).Count() == 0);
    nPatch.Files.Add(pf);
 }

foreach (string f in oldPatch)
{
    string filename = Path.GetFileName(f);
    string Dir = (Path.GetDirectoryName(f).Replace(_oldFolder, "") + @"\");
    PatchFile pf = new PatchFile();
    pf.Dir = Dir;
    pf.FName = filename;

    if (!nPatch.Files.Exists(item => item.Dir == pf.Dir && 
                             item.FName == pf.FName))
    {
        nPatch.removeFiles.Add(pf);
    }
}

1 ответ

У меня нет классов, которые вы используете (как DirectorySearch а также PatchFile), поэтому я не могу скомпилировать ваш код, но IMO строка _oldPatch.FindAll(... ничего не возвращает, потому что вы сравниваете полный путь (c:\oldpatch\filea.txt не является c:\newpatch\filea.txt), а не только имя файла. IMO ваш алгоритм может быть упрощен, что-то вроде этого псевдокода (используя List.Contains вместо List.FindAll):

var _newFolder = "d:\\temp\\xml\\b";
var _oldFolder = "d:\\temp\\xml\\a";
List<FileInfo> missing = new List<FileInfo>();
List<FileInfo> nPatch = new List<FileInfo>();
List<FileInfo> newPatch = new DirectoryInfo(_newFolder).GetFiles().ToList();
List<FileInfo> oldPatch = new DirectoryInfo(_oldFolder).GetFiles().ToList();
// take all files in new patch
foreach (var f in newPatch)
{
    nPatch.Add(f);
}
// search for hits in old patch
foreach (var f in oldPatch)
{
    if (!nPatch.Select (p => p.Name.ToLower()).Contains(f.Name.ToLower()))
    {
        missing.Add(f);
    }
}
// new files are in missing

Одним из возможных решений с меньшим количеством кода было бы выбрать имена файлов, поместить их в список, используя предопределенные методы List.Except или, если необходимо, методы List.Intersect. Таким образом, решение, какой файл находится в A но не в B можно решить так быстро:

var locationA = "d:\\temp\\xml\\a";
var locationB = "d:\\temp\\xml\\b";
// takes file names from A and B and put them into lists
var filesInA = new DirectoryInfo(locationA).GetFiles().Select (n => n.Name).ToList();
var filesInB = new DirectoryInfo(locationB).GetFiles().Select (n => n.Name).ToList();
// Except retrieves all files that are in A but not in B
foreach (var file in filesInA.Except(filesInB).ToList())
{
    Console.WriteLine(file);
}

я имею 1.xml, 2.xml, 3.xml в A а также 1.xml, 3.xml в B, Выход 2.xml - отсутствует в B,

Другие вопросы по тегам