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次。但我希望它只写一次。
任何帮助将不胜感激。提前致谢。 :)
答案 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(文件名,重复时间)列出所有存在的文件名。之后,您可以循环字典以写入控制台。