在同一目录中查找多个文件

时间:2015-08-11 08:16:52

标签: c# .net linq visual-studio

我正在尝试查找,给出路径,在同一目录中具有相同文件名但扩展名不同的文件列表(.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 };

任何帮助或线索?

由于

2 个答案:

答案 0 :(得分:0)

首先找到所有文件夹。

然后为每个文件夹找到具有相同名称但扩展名不同的所有文件。 像这样的东西:

        var list = new List<string>();
        foreach (var subDirectory in Directory.EnumerateDirectories(@"C:\Temp"))
        {
            var files = Directory.EnumerateFiles(subDirectory);
            var repeated = files.Select(Path.GetFileNameWithoutExtension)
                .GroupBy(x => x)
                .Where(g => g.Count() > 1)
                .Select(y => y.Key);
            list.AddRange(repeated);
        }

在.net 4.6上测试

答案 1 :(得分:0)

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

文件的文件夹路径由System.IO和其他库(如AlphaFS)中的GetDirectoryName返回。以下代码段仅返回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()
                    };