检查FileInfo数组中是否存在多个文件名

时间:2016-01-29 09:25:01

标签: c#

FileInfo[] folderFiles = folder.GetFiles();

foreach (FileInfo file in folderFiles)
{

    int fileCount = 0;

    StreamWriter sw = null;

    string fileName = Path.GetFileNameWithoutExtension(file.Name);

    string[] brkedfilename = fileName.Split('_');

    string stringToCheck = brkedfilename[3];

    for (int i = 0; i <= folderFiles.Count() - 1; i++)
    {
        string fileName2 = folderFiles[i].Name;

        string[] brkedfilename2 = fileName2.Split('_');

        if (brkedfilename2[3] == stringToCheck)
        {
            fileCount = ++fileCount;

            if (fileCount == 2)
           {
                sw = new StreamWriter(folderPath + "/" + newFileName, true);
                sw.WriteLine(stringToCheck + "  " + "--" + "  " + "Repeated in folder " + " " + folder.Name);
                sw.Close();
            }
        }
    }
}

通过这种方式,如果文件名存在2次,则写入该文件名2次。但我希望它只写一次。

任何帮助将不胜感激。提前致谢。 :)

3 个答案:

答案 0 :(得分:3)

您可以使用LINQ查找具有相同brkedNames的文件:

var repeatedFiles = from f in folderFiles
                    let brkedName = Path.GetFileNameWithoutExtension(f.Name).Split('_')[3]
                    group f by brkedName into g
                    where g.Count() > 1
                    select new
                    {
                        BrkedName = g.Key,
                        Count = g.Count(),
                        Files = g
                    };

此查询按分割名称的第4部分对所有文件进行分组(注意:与原始代码中一样,我不检查是否至少有4个部分),然后选择具有多个文件的组。它还提供了一些统计信息 - brked名称,具有相同名称和文件集合的文件数。

foreach(var group in repeatedFiles)
   sw.WriteLine($"{group.BrkedName} -- repeated {group.Count} times in {folder.Name}");

答案 1 :(得分:1)

我建议使用hashset。 Hashset不能包含重复元素。当您添加重复元素时,执行hashset方法Add返回false并且程序继续运行错误但hashset不会重复元素

var duplicate = new HashSet<string>();

    foreach (FileInfo file in folderFiles)
    {
        int fileCount = 0;

        StreamWriter sw = null;

        string fileName = Path.GetFileNameWithoutExtension(file.Name);

        string[] brkedfilename = fileName.Split('_');

        string stringToCheck = brkedfilename[3];

         if (!duplicate.Add(stringToCheck))
            {
                sw = new StreamWriter(folderPath + "/" + newFileName, true);
                sw.WriteLine(stringToCheck + "  " + "--" + "  " + "Repeated in folder " + " " + folder.Name);
                sw.Close();
            }
    }

当我知道元素在Hashset中时,当元素在Hashset已经Add metod返回false时,程序会添加每个元素Hashset重复我保存在你想要的文件

答案 2 :(得分:1)

您可以使用Dictionary(文件名,重复时间)列出所有存在的文件名。之后,您可以循环字典以写入控制台。