Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较两个文件夹中对称性不同的不相同文件_C#_Linq - Fatal编程技术网

C# 比较两个文件夹中对称性不同的不相同文件

C# 比较两个文件夹中对称性不同的不相同文件,c#,linq,C#,Linq,在这里,我比较了两个文件的基础上的名称和写入一个文本文件。。。但我需要像这样写目录名和名字 有什么建议吗 编辑: 我有两个文件夹A和B。在这两个文件夹里面有很多文件夹和文件。。。 我正在比较这两个文件夹中具有对称差异的不相同文件,并将名称和目录名写入文本文件…我的问题是对称差异工作正常,正在将两个不相同的文件名写入日志文件…但我必须使用该目录名写入文件名 此代码运行良好 var dir1Files = dir1.GetFiles("*", SearchOption.AllDirectories

在这里,我比较了两个文件的基础上的名称和写入一个文本文件。。。但我需要像这样写目录名和名字

有什么建议吗

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

此代码运行良好

 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);
在这里,我不能像这样给予

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();
公共类文件信息名称长度质量比较程序:平等比较程序
{
公共覆盖布尔等于(FileInfo x,FileInfo y)
{
如果(x==y)
返回true;
如果(x==null | | y==null)
返回false;
//如果两个文件的名称和长度相同,则它们相等。
返回x.Name==y.Name&&x.Length==y.Length;
}
公共覆盖int GetHashCode(FileInfo obj)
{
返回obj==null
?0:obj.Name.GetHashCode()^obj.Length.GetHashCode();
}
}
然后剩下的部分看起来像(未经测试):

//构造自定义相等比较器。
var comparer=new FileInfoNameLengthEqualityComparer();
//从每个目录创建文件集。
var set=new[]{dir1,dir2}
.Select(d=>d.GetFiles(“*”,SearchOption.AllDirectories))
.Select(文件=>新哈希集(文件、比较器))
.ToArray();
//使第一个集合包含所确定的集合差异
//通过相等比较器。
集合[0]。SymmetricExceptWith(集合[1]);
//将每个文件投影为其全名并写入文件名
//到日志文件。
var lines=sets[0]。选择(fileInfo=>fileInfo.FullName)。ToArray();
writeAllines(@“d:\log1.txt”,行);

@Ani:No如果我像这样给出变量dir1Files=dir1.GetFiles(“*”,SearchOption.AllDirectories)。选择(x=>new{x.Name})@Ani:它是比较并给出不相同的文件。否则它就是给出整个搜索result@bala3569:举个例子会很有帮助。@Ani:能理解我的问题吗???@bala3569:我想我明白了。我的答案是你想要的吗?@Ani:如果长度不同,我必须写长度和目录名,或者如果lastwritetime不同,我必须写lastwritetime和目录名…有可能吗???@Ani:如果我想比较三个东西的名称,长度和lastwritetime意味着我应该怎么写..有类似的吗EqualityComparer@bala3569:将`&&x.LastWriteTime==y.LastWriteTime`添加到
Equals
方法中。为了提高效率,您可能也想将写入时间构建到哈希代码方法中,但这对于函数的正确性不是必需的。@Ani:看看这个。。
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);