System.IO.Path или эквивалентное использование с путями Unix - PullRequest
6 голосов
/ 06 мая 2010

Можно ли использовать класс System.IO.Path или какой-либо подобный объект для форматирования пути в стиле Unix, обеспечивая функциональность, аналогичную классу PATH? Например, я могу сделать:

Console.WriteLine(Path.Combine("c:\\", "windows"));

Который показывает:

"C:\\windows"

Но я пытаюсь сделать то же самое с косой чертой (/), это просто меняет их для меня.

Console.WriteLine(Path.Combine("/server", "mydir"));

Который показывает:

"/server\\mydir"

Ответы [ 3 ]

3 голосов
/ 06 мая 2010

У вас есть большие проблемы, Unix принимает символы в имени файла, чем Windows не позволяет. Этот код будет бомбить с ArgumentException, "Недопустимые символы в пути":

  string path = Path.Combine("/server", "accts|payable");

Вы не можете надежно использовать Path.Combine () для путей Unix.

3 голосов
/ 01 июня 2010

Path.Combine использует значения Path.DirectorySeperatorChar и Path.VolumeSeparatorChar, и они определяются библиотеками классов во время выполнения - поэтому, если вы пишете свой код, используя только вызовы Path.Combine, значения Environment.SpecialFolder и т. Д. В-четвертых, он будет работать везде, так как Mono (и, вероятно, любая среда выполнения .NET) реализует собственный способ получения и построения этих путей для любой платформы, на которой он работает. (Ваш второй пример, например, возвращает /server/mydir для меня, но первый пример дает c:\/windows)

Если вы хотите, чтобы во всех случаях был жестко задан специфичный для UNIX путь, Path.Combine ничего вам не даст: Console.WriteLine ("/server/mydir"); делает то, что вы хотите в ОП.

Однако, как сказал Ганс, разные файловые системы имеют разные правила для разрешенных символов, длины пути и т. Д., Поэтому лучшая практика, как и при любом кроссплатформенном программировании, - это ограничивать себя использованием пересечения разрешенных функций между файловые системы, на которые вы ориентируетесь. Смотрите также вопросы чувствительности к регистру.

3 голосов
/ 06 мая 2010

В этом случае я бы использовал класс System.Uri или System.UriBuilder .

Примечание: если вы запускаете код .NET в Linux-системе с Mono-Runtime, класс Path должен возвращать ожидаемое поведение. Информация, которую использует класс Path, предоставляется базовой системой.

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