检查文件名是否在 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 次。但我希望它只写一次。
任何帮助将不胜感激。提前谢谢。:)
可以使用 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
中并且我根据需要保存在文件中时,程序会复制每个元素