Использование Path.GetDirectoryName в командной строке с необязательными параметрами и кавычками - PullRequest
0 голосов
/ 29 января 2010

Наши клиенты хранят в своем реестре строку, которая является исполняемой командой. Строка может иметь или не иметь кавычки вокруг целевого пути, и может иметь или не иметь параметры. Например:

"C: \ path \ file.exe" param1 = значение1 param2 = значение2
C: \ path \ file.exe param1 = значение1 param2 = значение2
"C: \ путь \ file.exe"
C: \ путь \ file.exe
«C: \ путь \ файл с пробелами» param1 = значение1 param2 = значение2
"C: \ путь \ файл с пробелами.exe"

Мне нужно получить каталог с целевым путем, т.е. C:\path.

  • Я пытался Path.GetDirectoryName, но это не с «Недопустимые символы в пути».
  • Я также пытался создать объект ProcessStartInfo, но, похоже, у него нет смысла разбирать строку.
  • Я возился с Uri, но мне тоже не повезло.

У меня есть решение, использующее регулярное выражение (которое я опубликую ниже в качестве ответа), но это выглядит как "должен быть встроен в .Net-helper-class-for-this" "проблема.

Есть класс, который я пропускаю, или просто не правильно использую классы выше?

Ответы [ 2 ]

1 голос
/ 29 января 2010

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

Regex pattern = new Regex(@"^(?<quot>"")?(?<path>(?(quot)[^""]|\S)*)", RegexOptions.ExplicitCapture);
var match = pattern.Match(value);
return Path.GetDirectoryName(match.Groups["path"].Value);
0 голосов
/ 29 января 2010

Я написал:

var strings = value.Split(" ", 2);
var firstString = strings.Length == 0 ? string.Empty : strings[0];
return Path.GetDirectoryName(firstString ); 

Но потом я ударил себя.

Тогда я увидел http://community.bartdesmet.net/blogs/bart/archive/2009/02/21/net-4-0-system-shell-commandline-parsing-part-1.aspx какое-нибудь применение?(не похоже, что он обрабатывает этот аспект синтаксического анализа, и он на самом деле не существует!)

Ни один из стандартных классов System.IO не обеспечивает какого-либо типа анализа, который вы ищете, поэтому я говорю, что вашРегулярное выражение хорошо, если кто-то не может найти общий.

Глядя в Reflector, весь код System.Environment, который выполняет синтаксический анализ командной строки, кажется Native, поэтому я был бы уверен, что вы не пропуститестандартные API для этой цели - этот тип рассмотрения (как представлены имена файлов) считается внешним по отношению к .NET (что имеет смысл, поскольку это зависит от платформы).

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