通过交叉检查在两个文件夹中查找新文件

本文关键字:文件夹 两个 查找 文件 新文件 检查 | 更新日期: 2023-09-27 18:02:34

我正在尝试将两个文件夹排序到一个修补文件夹中,在新文件夹中查找哪个文件是新的,并将其标记为新的,这样我只能传输该文件。我不在乎日期或零钱。新文件夹中不在旧文件夹中的文件。

不知怎的线路

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

总是返回false。我的交叉检查逻辑有问题吗?

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

通过交叉检查在两个文件夹中查找新文件

我没有您正在使用的类(如DirectorySearchPatchFile(,所以我无法编译您的代码,但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);
}

我在CCD_ 11中有1.xml, 2.xml, 3.xml,在B中有1.xml, 3.xml。输出为2.xml——B中缺少。