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

本文关键字:存在 数组 FileInfo 文件名 是否 检查 | 更新日期: 2023-09-27 18:32:34

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 次。但我希望它只写一次。

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

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

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

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}");

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

我建议使用哈希集。哈希集不能包含重复的元素。当您添加重复元素时,哈希集方法Add返回false并且程序继续错误,但哈希集不会采用重复元素

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中并且我根据需要保存在文件中时,程序会复制每个元素