Обход подпапки - PullRequest
       21

Обход подпапки

1 голос
/ 10 сентября 2010

У меня есть набор подпапок глубиной 3 уровня с более чем 20k файлами в c:\MyData.

На моем диске E есть почти идентичный набор подпапок в e:\projects\massdata

Я хочу проверить в C и все, что уже существует в E (то же имя папки, то же имя файла, тот же размер), я хочу удалить из C.

Каков мой лучший способ обхода этой структуры папок?

Ответы [ 2 ]

3 голосов
/ 10 сентября 2010

как насчет использования оператора соединения. присоединиться к имени файла, как это

public void cleanUp()
    {
        var cFiles = Directory.GetFiles(@"c:\MyData","*.*",SearchOption.AllDirectories);
        var fFiles = Directory.GetFiles(@"e:\projects\massdata","*.*",SearchOption.AllDirectories);
        Func<string, string, Tuple<string, long>> keySelector = (path, root) =>
            new Tuple<string, long>(path.Replace(root, ""), new FileInfo(path).Length);

        foreach (var file in cFiles.Join(fFiles, f => keySelector(f,@"e:\projects\massdata"), c => keySelector(c,@"c:\MyData"), (c, f) => c))
        {
            File.Delete(file);
        }
    }

Второе редактирование после обновления: Селектор ключей теперь должен соответствовать вашим требованиям. Если я их неправильно понял. Конечно, это будет довольно легко, поэтому посмотрите, что вам нужно изменить. Если нет, оставьте комментарий:)

2 голосов
/ 10 сентября 2010

Рекурсивно проходить через все файлы в каждом каталоге.

Создать строку, описывающую относительный путь, размер файла и т. Д. Файлов в E в hashMap .Затем просто проверьте, существует ли относительный путь к конкретному файлу при переходе через C, и удалите его, если так.

Например, строка может быть [FILENAME] ## [FILESIZE] ## [LASTEDITER].

Вот один из способов рекурсивного поиска в C #: http://support.microsoft.com/kb/303974

...