Regex для анализа имени файла и частичного пути, условно - PullRequest
4 голосов
/ 08 сентября 2010

У меня есть приложение C #, которое использует функции поиска, чтобы найти все файлы в каталоге, а затем показывает их в списке. Мне нужно иметь возможность фильтровать файлы по расширению (возможно, используя функцию поиска) и (например, блокировать показ любых в каталогах "test" или "debug").

Мой текущий код выглядит примерно так:

Regex filter = new Regex(@"^docs\(?!debug\)(?'display'.*)\.(txt|rtf)");
String[] filelist = Directory.GetFiles("docs\\", "*", SearchOption.AllDirectories);
foreach ( String file in filelist )
{
    Match m = filter.Match(file);
    if ( m.Success )
    {
        listControl.Items.Add(m.Groups["display"]);
    }
}

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

Мне нужно иметь возможность выбрать раздел (обычно относительный путь и имя файла), который будет использоваться в качестве отображаемого имени, при этом игнорируя любые файлы с определенным именем папки в качестве раздела их пути. Например, для этих файлов должны совпадать только файлы с + s:

+ docs\info.txt
- docs\data.dat
- docs\debug\info.txt
+ docs\world\info.txt
+ docs\world\pictures.rtf
- docs\world\debug\symbols.rtf

Мое регулярное выражение работает для большинства из них, за исключением того, что я не уверен, как заставить его работать с ошибкой в ​​последнем файле Любые предложения о том, как сделать эту работу?

Ответы [ 2 ]

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

Попробуйте Directory.GetFiles . Это должно делать то, что вы хотите.

Пример:

// Only get files that end in ".txt"
string[] dirs = Directory.GetFiles(@"c:\", "*.txt", SearchOption.AllDirectories);
Console.WriteLine("The number of files ending with .txt is {0}.", dirs.Length);
foreach (string dir in dirs) 
{
   Console.WriteLine(dir);
}
2 голосов
/ 08 сентября 2010
^docs\\(?:(?!\bdebug\\).)*\.(?:txt|rtf)$

будет соответствовать строке,

  1. начинается с docs\,
  2. нигде не содержит debug\ (якорь \b обеспечивает совпадение debug как целого слова) и
  3. оканчивается на .txt или .rtf.
...