我正在尝试查找,给出路径,在同一目录中具有相同文件名但扩展名不同的文件列表(.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
但是使用我的代码,由于
,还包含了filename3g.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 };
任何帮助或线索?
由于
答案 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\filename1
,Dir1\filename2
和DifferentDir\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()
};