Есть ли в .NET Framework какие-либо методы для преобразования пути (например, "C:\whatever.txt"
) в URI файла (например "file:///C:/whatever.txt"
)?
System.Uri имеет обратную (от URI файла до абсолютного пути), но ничего, насколько я могу найти для преобразования в URI файла.
Кроме того, это не приложение ASP.NET.
var path = new Uri("file:///C:/whatever.txt").LocalPath;
превращает Uri обратно в локальный путь к файлу для тех, кому это нужно.new Uri(@"C:\%51.txt").AbsoluteUri
дает"file:///C:/Q.txt"
вместо вас"file:///C:/%2551.txt"
То, что никто, кажется, не понимает, - то, что ни один из
System.Uri
конструкторов правильно не обрабатывает определенные пути с символами процента в них.Это дает вам
"file:///C:/Q.txt"
вместо"file:///C:/%2551.txt"
.Ни одно из значений устаревшего аргумента dontEscape не имеет никакого значения, и указание UriKind также дает тот же результат. Попытка с UriBuilder также не помогает:
Это также возвращается
"file:///C:/Q.txt"
.Насколько я могу сказать, в фреймворке на самом деле отсутствует какой-либо способ сделать это правильно.
Мы можем попытаться сделать это, заменив обратную косую черту прямой косой чертой и указав путь к
Uri.EscapeUriString
- т.е.Поначалу кажется, что это работает, но если вы дадите ему путь,
C:\a b.txt
то в итоге вы получитеfile:///C:/a%2520b.txt
вместоfile:///C:/a%20b.txt
- каким-то образом он решит, что некоторые последовательности должны быть декодированы, а другие нет. Теперь мы могли бы просто"file:///"
поставить перед собой префикс , однако в нем не учитываются пути UNC, например,\\remote\share\foo.txt
что в Windows кажется общепринятым - превращать их в псевдо-URL-адреса формыfile://remote/share/foo.txt
, поэтому мы должны принять это во внимание также.EscapeUriString
Также есть проблема в том, что он не избежит'#'
персонажа. В этот момент может показаться, что у нас нет другого выбора, кроме как создать собственный метод с нуля. Вот что я предлагаю:Это преднамеренно оставляет + и: незашифрованными, так как кажется, что это обычно делается в Windows. Он также кодирует только латиницу 1, поскольку Internet Explorer не может понимать символы Юникода в URL-адресах файлов, если они закодированы.
источник
Вышеуказанные решения не работают в Linux.
Используя .NET Core, попытка выполнить
new Uri("/home/foo/README.md")
приводит к исключению:Вам нужно дать CLR несколько советов о том, какой у вас URL.
Это работает:
... и строка , возвращаемая
fileUri.ToString()
IS"file:///home/foo/README.md"
Это работает и в Windows.
new Uri(new Uri("file://"), @"C:\Users\foo\README.md").ToString()
... излучает
"file:///C:/Users/foo/README.md"
источник
new Uri("/path/to/file", UriKind.Absolute);
VB.NET:
Разные выходы:
Один лайнер:
источник
AbsoluteUri
правильный, потому что он также кодирует пробелы в% 20.По крайней мере, в .NET 4.5+ вы также можете сделать:
источник
UriFormatException
один день?new Uri(@"C:\%51.txt",UriKind.Absolute).AbsoluteUri
возвращает"file:///C:/Q.txt"
вместо"file:///C:/%2551.txt"
UrlCreateFromPath на помощь! Ну, не совсем, поскольку он не поддерживает расширенные и UNC-форматы пути, но это не так сложно преодолеть:
Если путь начинается со специального префикса, он удаляется. Хотя в документации это не упоминается, функция выводит длину URL, даже если буфер меньше, поэтому я сначала получаю длину, а затем выделяю буфер.
У меня было очень интересное наблюдение: «\\ device \ path» правильно преобразуется в «file: // device / path», в частности «\\ localhost \ path» преобразуется в просто «file: /// path» ,
Функция WinApi сумела кодировать специальные символы, но оставляет символы, не связанные с Unicode, в отличие от Uri-конструктора . В этом случае AbsoluteUri содержит правильно закодированный URL, а OriginalString можно использовать для сохранения символов Unicode.
источник
Обходной путь прост. Просто используйте метод Uri (). ToString () и запишите процентные пробелы, если таковые имеются, впоследствии.
правильно возвращает файл: /// C: / my% 20example ㄓ .txt
источник