2015-08-11 7 views
0

Я пытаюсь найти, указав путь, список файлов с одинаковыми именами файлов, но разными расширениями (и .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 

Но с моим кодом, имя_файла3 также включены из-за

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 }; 

Любая помощь или ключ?

Thanks

+0

'Path' не имеет метод' GetLongPath'. Вы используете AlphaFS? Вы пытались с помощью 'GetDirectoryName'? –

+0

Я использую dll Delimon из-за проблемы с длинной строкой пути http://stackoverflow.com/questions/31919748/directory-getfiles-stops-searching-when-error –

+0

В этом случае проблема заключается в библиотеке, а не в коде LINQ , Являются ли ваши пути действительно относительными? Поддерживает ли библиотека относительные пути? –

ответ

0

System.IO.Path не метод GetLongPath. Я подозреваю, что вы используете внешнюю библиотеку, такую ​​как AlphaFS. В любом случае GetLongPath возвращает полный файл путь, а не путь к папке файла.

Путь к папке файла возвращается GetDirectoryName как в System.IO, так и в других библиотеках, таких как AlphaFS. Следующий фрагмент кода будет возвращать только 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() 
        }; 
+0

Кажется, работает! Я попробую с большим картографическим диском, и я скажу вам ... спасибо в любом случае! –

+0

BTW GetLongPath возвращает полное имя файла, а не папку. Это похоже на попытку группировки по пути полного файла –

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

+0

У OP уже есть все файлы из всех папок, это не проблема. Вопрос задает вопрос о том, как группировать по папке и расширению, и почему текущий подход завершается. –

+0

@PanagiotisKanavos это правильно. Ваш код интересен, но я не могу его использовать, потому что мне нужно поддерживать имена длинного пути и несколько подпапок с dll Delimon http://stackoverflow.com/questions/31919748/directory-getfiles-stops-searching-when-error/31920319 # 31920319 –

Смежные вопросы