[c#]在相同的目录中查找多个文件

发布时间: 2017/2/26 23:38:01
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想找到,给一条路,有相同的文件名,但不同的扩展名的文件的列表 ( .bak.dwg ) 相同的目录中。

我有此代码︰

String[] FileNames = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".bak") || s.EndsWith(".dwg")).ToArray();
var queryDupNames = from f in FileNames
                    group f by Path.GetFileNameWithoutExtension(f) into g
                    where g.Count() > 1                                            
                    select new { Name = g.Key, FileNames = g };

这工作很高兴找到具有相同文件名,但在整个系统中的文件。我只需要获取那些相同的目录中。

例如︰

- Dir1\filename1.bak
- Dir1\filename1.dwg
- Dir1\filename2.bak
- Dir1\filename2.dwg
- Dir1\filename3.dwg
- DiferentDir\filename1.bak
- DiferentDir\filename1.dwg
- DiferentDir\filename3.dwg

结果应该是︰

- Dir1\filename1.bak
- Dir1\filename1.dwg
- Dir1\filename2.bak
- Dir1\filename2.dwg
- DiferentDir\filename1.bak
- DiferentDir\filename1.dwg

但与我的代码,filename3 还包括由于

g.count() > 1

是真的。它按只有文件名进行分组...我试着修复这段代码却 0 结果︰

String[] FileNames = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Where(s => s.EndsWith(".bak") || s.EndsWith(".dwg")).ToArray();
var queryDupNames = from f in FileNames
                    group f by new { path = Path.GetLongPath(f), filen = Path.GetFileNameWithoutExtension(f) } into g
                    where g.Count() > 1                                            
                    select new { Name = g.Key, FileNames = g };

任何帮助或线索吗?

谢谢你

解决方法 1:

System.IO.Path不会有一个 GetLongPath 方法。我怀疑你利用像 AlphaFS 的外部库。在任何情况下, GetLongPath 返回的完整文件路径,而不是该文件的文件夹的路径。

该文件的文件夹路径经由 GetDirectoryName System.IO 和其他库中的两个都喜欢 AlphaFS。下面的代码段将只返回 Dir1\filename1Dir1\filename2DifferentDir\filename1

var files = new[]
{
    @"c:\Dir1\filename1.bak",
    @"c:\Dir1\filename1.dwg",
    @"c:\Dir1\filename2.bak",
    @"c:\Dir1\filename2.dwg",
    @"c:\Dir1\filename3.dwg",
    @"c:\DiferentDir\filename1.bak",
    @"c:\DiferentDir\filename1.dwg",
    @"c:\DiferentDir\filename3.dwg",
};

var duplicates =   from file in files
                    group file by new
                    {
                        Folder = Path.GetDirectoryName(file),
                        Name = Path.GetFileNameWithoutExtension(file)
                    } into g
                    where g.Count()>1
                    select new
                    {
                        Name = g.Key,
                        Files = g.ToArray()
                    };
官方微信
官方QQ群
31647020