gpt4 book ai didi

C#比较基于名称的文件列表不返回完整路径

转载 作者:行者123 更新时间:2023-11-30 16:41:52 25 4
gpt4 key购买 nike

我正在编写一个方法,我希望能够根据文件名比较来自 2 个不同目录的文件列表,然后将第二个目录中不存在的所有文件存储到一个列表中稍后使用(很可能创建另一种方法来复制/移动这些文件)。

在我查看文件列表 (FilesRemaiing list) 并尝试获取文件的完整路径之前,一切似乎都在正常工作。它最终指向我的 bin/debug 路径。

我相信这是因为在我的查询中,我专门查询要比较的 file.Name,而不是 file.FullName。这样做的原因是因为 FullName 将返回路径和文件名,我不能将其用于我的比较语句 (var FilesRemaining = FileList1.Except(FileList2).ToList();)。

所以我的问题就变成了,我如何仅根据名称比较 2 组文件,然后将异常(exception)列表的完整路径存储到第三个列表中,以便我稍后用于复制/移动?

这是我的方法:

   public static List<string> CompareFiles(string ComparePath1, string ComparePath2)
{
List<string> FileList1 = new List<string>();
List<string> FileList2 = new List<string>();
List<string> CompareFileList = new List<string>();
DirectoryInfo directory1 = new DirectoryInfo(ComparePath1);
FileInfo[] files1 = directory1.GetFiles("*.*", SearchOption.TopDirectoryOnly);
DirectoryInfo directory2 = new DirectoryInfo(ComparePath2);
FileInfo[] files2 = directory2.GetFiles("*.*", SearchOption.TopDirectoryOnly);

//Queries the given directory for filenames
var query1 = from file in files1
where (!file.Attributes.HasFlag(FileAttributes.Hidden))
select (file.Name);
foreach (var file in query1)
{
FileList1.Add(file);
}

var query2 = from file in files2
where (!file.Attributes.HasFlag(FileAttributes.Hidden))
select (file.Name);
foreach (var file in query2)
{
FileList2.Add(file);
}

var FilesRemaining = FileList1.Except(FileList2).ToList();

foreach (var file in FilesRemaining)
{
string fullFile = Path.GetFullPath(file);
CompareFileList.Add(fullFile);
Console.WriteLine(fullFile);
}

return CompareFileList;

}

最佳答案

使用它,您可以保留 FileInfo 对象,并且仍然仅使用它们的名称来计算 Except 列表。

//More efficient way to get your files.
IEnumerable<FileInfo> files1 = directory1
.GetFiles("*.*", SearchOption.TopDirectoryOnly)
.Where(x => !x.Attributes.HasFlag(FileAttributes.Hidden));
IEnumerable<FileInfo> files2 = directory2
.GetFiles("*.*", SearchOption.TopDirectoryOnly)
.Where(x => !x.Attributes.HasFlag(FileAttributes.Hidden));

//It uses the FileNameComparer class to compare to values.
IEnumerable<FileInfo> filesRemaining = files1.Except(files2, new FileNameComparer());

这是 FileNameComparer 类。

public class FileNameComparer : IEqualityComparer<FileInfo>
{
public bool Equals(FileInfo x, FileInfo y)
{
//Here is where the magic is happening.
return x.Name == y.Name;
}

//You need this too, altougt, I am not quite sure when it gets used.
public int GetHashCode(FileInfo obj)
{

return obj.Name.GetHashCode();
}
}

关于C#比较基于名称的文件列表不返回完整路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47876254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com