Как распознать путь внутри строки - PullRequest
2 голосов
/ 15 ноября 2008

Просто ... я получаю строку, которая содержит путь к файлу плюс несколько аргументов. Как я могу узнать путь? Я думал об индексе «.» в файле ... но мне это не нравится.
Как насчет использования регулярных выражений? Кто-нибудь может указать мне правильное направление?

Привет

Редактировать: Тезисы являются действительными записями ...
somefile.msi / a
C: \ MyFolder \ SomeFile.exe -i -d

Меня не волнуют аргументы, потому что, как только у меня будет путь, я предполагаю, что остальные аргументы

Ответы [ 9 ]

6 голосов
/ 15 ноября 2008

Вы можете использовать System.IO.Path, и это статические методы.

bool isPath = System.IO.Path.GetDirectoryName(@"C:\MyFolder\SomeFile.exe -i -d") != String.Empty;
if (isPath)
{
    Console.WriteLine("The string contains a path");
}

Статический класс Path имеет несколько других полезных методов, таких как .GetFilename, .GetExtension и .GetPathRoot.

Вы также можете использовать System.IO.Directory и System.IO.File для дополнительных функций.

4 голосов
/ 15 ноября 2008

Вы не можете получить доступ к файловой системе, поскольку пути могут содержать пробелы.

Таким образом, вы можете протестировать каждый возможный «файл», используя File.Exists. Здесь вам поможет строка. Split ().

1 голос
/ 16 ноября 2008

Для не-MSI программ UninstallString передается CreateProcess, поэтому вы, вероятно, захотите повторить его метод определения имени файла. Прочитайте http://msdn.microsoft.com/en-us/library/ms682425.aspx,, особенно примечания для lpApplicationName и второй половины lpCommandLine.

Программы, установленные MSI, имеют отдельную систему (msi! MsiConfigureProduct или msi! MsiRemovePatches).

1 голос
/ 15 ноября 2008

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

Например:

C:\My Folder\Some File.exe -i -d
=>
C:\My Folder\Some File.exe -i -d (no, although it might exist!)
C:\My Folder\Some File.exe -i    (no)
C:\My Folder\Some File.exe       (yes => That's this one)

Вы должны учитывать относительные пути и файлы в PATH (как ваш первый пример, т.е. все exe-файлы - еще хуже, вы можете написать foo.exe или foo в командной строке!).

Кроме того, вы часто можете писать такие вещи, как notepad/p, что не упрощает алгоритм, зная, что C:/windows/notepad.exe - это правильный путь в XP! : -)

1 голос
/ 15 ноября 2008

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

1 голос
/ 15 ноября 2008

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

Для операционной системы это допустимое имя файла: a

Поскольку информация о каталоге не указана, будет использоваться текущий каталог . Файл не имеет расширения.

Но это все еще имя файла.

Это путь в вашем контексте? Или вы имеете в виду что-то, что также имеет справочную информацию?

Примеры того, что вам нужно обработать, были бы полезны.

0 голосов
/ 15 ноября 2008

спасибо всем за ответы ... есть пара постов, которые я хотел бы отметить как ответ ... что вы делаете в этих случаях?

На тот случай, если кто-то захочет узнать, над чем я работаю, это небольшое приложение, используемое для удаления программного обеспечения с моего компьютера. Я разместил код, поэтому не стесняйтесь загружать его и смотреть на него.
Причиной этого поста является хороший способ реализации метода private ProcessStartInfo GetProcessInfo(string uninstallString).

Причина этого проекта размещена здесь ...

0 голосов
/ 15 ноября 2008

Взгляните на SYstem.IO.Path, вы, вероятно, хотите GetDirectoryName (string)

0 голосов
/ 15 ноября 2008

Если у вас есть какой-либо контроль над строкой, я бы рекомендовал вам изменить способ ее представления. Одним из способов будет использование параметров в стиле URL - например, fileName = myFile; arg1 = value и т. д. Тогда анализировать ключи тривиально.

Проблема с любой необработанной схемой синтаксического анализа заключается в том, что конечные данные не обязательно будут чистыми. Кроме того, ваше имя файла не обязательно будет содержать пробелы, посторонние символы "." И т. Д. Поэтому все, что вы решите, может быть неверным в 100% случаев.

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