Преобразование относительных путей в абсолютные пути C # - PullRequest
3 голосов
/ 15 июля 2010

У меня есть программа, которая отслеживает html-файлы и находит теги href, берет строку внутри (ссылку) и преобразует ее в местоположение файла.

Проблема возникает, когда тег href использует относительные ссылки,Например:

<a href="../../../images/arrow.gif"/>

В этом случае моя программа возвращает, например:

\\server\webroot\folder\foo\bar\mew\..\..\..\images\arrow.gif

(поскольку она не начинается с "http", она добавляетсяпуть к файлу, в котором он находится к началу).

Это, очевидно, можно упростить до:

\\server\webroot\folder\images\arrow.gif

Есть ли объект, который может сделать такое упрощение или сделатьМне нужно провести разбор строк - и если да, то как лучше?

Ответы [ 4 ]

6 голосов
/ 15 июля 2010

Вы можете использовать класс Uri, чтобы объединить их:

Uri root = new Uri(@"\\server\webroot\folder\foo\bar\mew\", UriKind.Absolute);
Uri relative = new Uri("../../../images/arrow.gif", UriKind.Relative);

Uri comb = new Uri(root, relative);
3 голосов
/ 10 марта 2016

Класс Path предоставляет метод GetFullPath (string path)

Например

Path.GetFullPath(@"\\server\webroot\folder\foo\bar\mew\..\..\..\images\arrow.gif")

возвращает

@"\\server\webroot\folder\images\arrow.gif"
3 голосов
/ 15 июля 2010

Я предполагаю, что вы используете ASP.NET здесь. В этом случае, я думаю, вы просто хотите, чтобы функция Server.MapPath возвращала фактический физический URI файла.

var absoluteUrl = this.Server.MapPath("../../../images/arrow.gif");
// absoluteUrl = "\\server\webroot\folder\images\arrow.gif"

(this относится к текущей странице курса. Вы всегда можете использовать HttpContext.Current.Server вместо этого, если это не доступно по какой-либо причине.)

Примечание: Если вы хотите сделать что-то вручную, и у вас уже есть определенная строка, например "\ server \ webroot \ folder \", то функциональность System.IO.Path должна выполнить ту работу, которую я считаю:

var absoluteUri = Path.GetFullPath(Path.Combine("\\server\webroot\folder\",
    "../../../images/arrow.gif"));
1 голос
/ 15 июля 2010

Проверьте очевидных кандидатов:

  • Path
  • DirectoryInfo

Могу поспорить, у них есть какой-то способ сделать это. Угадайте: создайте новый DirectoryInfo объект для вашего пути и затем проверьте свойства - возможно, где-то там канонический путь ...

...