dabbourabd Ответов: 1

поиск дублированных файлов


привет всем

я пытаюсь сделать проект, который найдет все дублированные файлы в каталоге

первый шаг я хочу получить все файлы в этом каталоге и его подкаталогах

поэтому я попробовал этот код

List<string> enumeratedFiles = Directory.EnumerateFiles(@"d:\", "*.*", SearchOption.AllDirectories)
                .Where(str => str.Contains(".")).AsParallel().ToList();


но я получаю эту ошибку
Доступ к пути 'd:\System информация об объеме отказана.

я знаю, что не могу получить доступ к этому каталогу
но есть ли и способ пропустить этот каталог и продолжить


спасибо за все

Matt T Heffron

Я не думаю, что есть какой-либо способ пропустить каталоги с проблемами разрешений.
Я думаю, что вам нужно будет рекурсивно пройти через структуру каталогов в вашей собственной реализации, пропуская каталоги/файлы с проблемами разрешений.
(Поскольку это будет связано с вводом-выводом, а не с процессором, я не думаю, что это хороший кандидат для распараллеливания.)

1 Ответов

Рейтинг:
1

Zoltán Zörgő

Насколько я знаю, нет встроенной функции для обработки исключений с отказом в доступе. Вам придется сделать рекурсию вручную.
Хороший пример можно найти http://stackoverflow.com/questions/172544/ignore-folders-files-when-directory-getfiles-is-denied-access:

using System;
using System.IO;
static class Program
{
    static void Main()
    {
        string path = ""; // TODO
        ApplyAllFiles(path, ProcessFile);
    }
    static void ProcessFile(string path) {/* ... */}
    static void ApplyAllFiles(string folder, Action<string> fileAction)
    {
        foreach (string file in Directory.GetFiles(folder))
        {
            fileAction(file);
        }
        foreach (string subDir in Directory.GetDirectories(folder))
        {
            try
            {
                ApplyAllFiles(subDir, fileAction);
            }
            catch
            {
                // swallow, log, whatever
            }
        }
    }
}

Вам придется уточнить это, чтобы соответствовать вашей фильтрации.


dabbourabd

спасибо за повтор

теперь я использую этот код

Свернуть / Скопировать Код

Список<строка> У dirsearch еще(строка sdir успешно)
{
Список<строка> У filesPathes = новый список<строка&ГТ;();

пробовать
{
foreach (строка f в каталоге.GetFiles(sDir))
{

filesPathes.Добавить(f);
All_files[1]. Add(f);
All_files[0].Добавить(Ф.Подстрока(Ф.LastIndexOf("\\")+1));
txtcurrentfile.Текст = f;
}

foreach (строка d в каталоге.GetDirectories (sDir))
{
filesPathes.AddRange(DirSearch(d));
}
}
ловить
{
}

возврат filesPathes;
}




но моя проблема-это время, потому что я говорю о 300000 файлах
таким образом, мне требуется около 2 минут, чтобы получить список всех файлов
но я пытаюсь сократить время, используя

Свернуть / Скопировать Код

List & lt;string> enumeratedFiles = каталог.EnumerateFiles (@"d:\", "*.*", SearchOption.AllDirectories)
. Где (str = & gt; str.Содержит(".")).Методами asparallel().Список();



потому что это намного быстрее, поэтому я пытаюсь пропустить ошибку, как я уже говорил раньше

Zoltán Zörgő

Да, если вы не читаете мой ответ, почему вы отвечаете? Я уже говорил, что вы не можете делать обработку ошибок таким образом. Но вы можете включить параллелизм в свой оригинальный метод и в метод, который я дал.