使用 SymmetricDifference 比较两个文件夹中的不同文件

2024-01-07

 var dir1Files = dir1.GetFiles("*", SearchOption.AllDirectories);
 var dir2Files = dir2.GetFiles("*", SearchOption.AllDirectories);

 var difference = dir1Files.ToHashSet(); 
 difference.SymmetricExceptWith(dir2Files);

 string[] foo1 = difference.Select(c => c.Name).ToArray();
 File.WriteAllLines(@"d:\log1.txt", foo1);

在这里,我根据名称比较两个文件并写入文本文件...但是我需要像这样写入名称和目录名称比较两个文件夹中的不同文件? https://stackoverflow.com/questions/4387028/comparing-two-folders-for-non-identical-files...

有什么建议吗?

EDIT:我有两个文件夹 A 和 B..这两个文件夹里面有很多文件夹和文件... 我正在比较这两个文件夹中具有对称差异的非相同文件,并将名称和目录名称写入文本文件...我的问题是对称差异工作正常,并将两个非相同文件名写入日志文件...但我必须用该目录名写入文件名......

这段代码工作正常

var dir1Files = dir1.GetFiles("*", SearchOption.AllDirectories).Select(x => new { x.Name, x.Length });
var dir2Files = dir2.GetFiles("*", SearchOption.AllDirectories).Select(x => new { x.Name, x.Length });
var difference = dir1Files.ToHashSet();      
difference.SymmetricExceptWith(dir2Files);
string[] foo1 = difference.Select(c => c.Name).ToArray();
File.WriteAllLines(@"d:\log1.txt", foo1); 

在这里我不能这样给予

string[] foo1 = difference.Select(c => c.Name+""+c.DirectoryName).ToArray();

我认为最好的方法是自己编写IEqualityComparer<FileInfo> http://msdn.microsoft.com/en-us/library/ms132151.aspx强制执行两个文件之间相等性定义的实现。

public class FileInfoNameLengthEqualityComparer : EqualityComparer<FileInfo>
{
    public override bool Equals(FileInfo x, FileInfo y)
    {
        if (x == y)
            return true;

        if (x == null || y == null)
            return false;

        // 2 files are equal if their names and lengths are identical.
        return x.Name == y.Name && x.Length == y.Length;
    }

    public override int GetHashCode(FileInfo obj)
    {
        return obj == null
               ? 0  : obj.Name.GetHashCode() ^ obj.Length.GetHashCode();
    }
}

然后其余部分看起来像(未经测试):

// Construct custom equality-comparer.
var comparer = new FileInfoNameLengthEqualityComparer();

// Create sets of files from each directory.
var sets = new[] { dir1, dir2 }
                 .Select(d => d.GetFiles("*", SearchOption.AllDirectories))
                 .Select(files => new HashSet<FileInfo>(files, comparer))
                 .ToArray();

// Make the first set contain the set-difference as determined 
// by the equality-comparer.
sets[0].SymmetricExceptWith(sets[1]);

// Project each file to its full name and write the file-names
// to the log-file.
var lines = sets[0].Select(fileInfo => fileInfo.FullName).ToArray();
File.WriteAllLines(@"d:\log1.txt", lines); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SymmetricDifference 比较两个文件夹中的不同文件 的相关文章

随机推荐