0

我正在尝试搜索 path1 中的文件。如果该文件存在于 path2 中,它将列在 listView 中。

这是我的代码。它似乎不起作用...

string path = @"C:\temp\code\path1";
string path2 = @"C:\temp\code\path2";
string fileType = "*.h";

DirectoryInfo d1 = new DirectoryInfo(path);
DirectoryInfo d2 = new DirectoryInfo(path2);

foreach (FileInfo f1 in d1.GetFiles(fileType, SearchOption.AllDirectories))
{
    foreach (FileInfo f2 in d2.GetFiles(fileType, SearchOption.AllDirectories))
    {
        if (f1 == f2)
        {
            lstProjectFiles.Items.Add(f1.Name).SubItems.Add(path);
        }
        else 
        {
            MessageBox.Show("False");
        }
    }
}
4

2 回答 2

3

当您比较时f1 == f2,您正在比较FileInfo不同对象的引用。您需要比较文件及其子文件夹的名称(我删除了文件夹名称的开头以仅保留公共部分):

if (f1.FullName.Replace(path, "") == f2.FullName.Replace(path2, ""))

此比较基于文件名及其在文件夹结构中的位置。

于 2013-11-07T05:28:07.103 回答
0

您应该只使用FileInfo 类的 Name 属性。FileInfo 类中还有其他有用的信息,但这不会告诉您文件包含相同的数据(不确定这是否是您甚至想要做的)。

       string path = @"C:\temp\code\path1";
        string path2 = @"C:\temp\code\path2";
        string fileType = "*.h";


        DirectoryInfo d1 = new DirectoryInfo(path);
        DirectoryInfo d2 = new DirectoryInfo(path2);

        foreach (FileInfo f1 in d1.GetFiles(fileType, SearchOption.AllDirectories))
        {
            foreach (FileInfo f2 in d2.GetFiles(fileType, SearchOption.AllDirectories))
            {
                if (f1.Name == f2.Name)
                {
                    // you could also test the size before comparing actual data
                    if (f1.Length == f2.Length)
                    {
                        Console.WriteLine(string.Format("these files might be the same: {0}, {1}", f1.Name, f2.Name));
                    }
                    //lstProjectFiles.Items.Add(f1.Name).SubItems.Add(path);
                }
                else
                {
                    Console.WriteLine("False");
                }
            }
        }
于 2013-11-07T06:21:34.950 回答