Сортировка сегментов с использованием вопроса с полным именем файла - действительно вопрос разбора - PullRequest
0 голосов
/ 09 апреля 2011

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

У меня есть три ведра, может, больше, и я могу измениться. Скажем, у меня есть три блока, в которые копируются эти файлы, например, "foo", "foo \ bar" и "foo \ baz". Таким образом, файл C: \ mumble \ foo \ bar \ thing.extension попадает в корзину foo \ bar, а C: \ fumble \ foo \ baz \ this \ is \ another \ directory \ bling.extension - в \ foo \ baz bucket, и D: \ stumble \ foo \thing.extension входит в корзину foo. Мне нужно перенаправить файлы, чтобы я использовал IndexOf (чтобы я мог создать направление копирования), но это не очень хорошо работает, потому что \ foo и foo \ bar похожи и требуют разных сегментов. Тогда я подумал, что могу использовать file.Contains, но \ foo и \ foo \ baz идут в разные сегменты, поэтому нужен приоритет, foo \ bar для одного, но \ foo для другого.

Есть идеи, как сделать это с относительной простотой? Мой код смущает.

Спасибо, Даг

1 Ответ

0 голосов
/ 09 апреля 2011

Попробуйте что-то похожее на это.

    private static readonly Regex _foo = new Regex(@"\\foo\\(?! (bar|baz)\\)",
        RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

    private static readonly Regex _foobar = new Regex(@"\\foo\\bar\\",
        RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

    private static readonly Regex _foobaz = new Regex(@"\\foo\\baz\\",
        RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);

...

        foreach (var filename in files)
        {
            if (_foo.IsMatch(filename))
            {
                // bucket foo
            }
            else if (_foobar.IsMatch(filename))
            {
                // bucket foobar
            }
            else if (_foobaz.IsMatch(filename))
            {
                // bucket foobaz
            }
        }

...

В качестве альтернативы, снимите отрицательный взгляд в _foo и простосделайте это последним условием оператора if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...