Функция, которая часто используется, но я никогда не нашел подходящего решения в Интернете. Сегодня я воспользовался возможностью проекта приложения, чтобы написать два метода преобразования абсолютных путей в виртуальные пути и их инкапсуляции. Путь преобразуется в виртуальный. путь относительно указанной страницы
/**//// <сводка>
/// Конвертируем абсолютный путь под сайтом в виртуальный путь относительно указанной страницы
/// </сводка>
/// <param name="page">Указатель текущей страницы, обычно это</param>
/// <param name="specifiedPath">Абсолютный путь</param>
/// <returns>Виртуальный путь, тип: ../../</returns>
общедоступная статическая строка ConvertSpecifiedPathToRelativePathForPage (страница страницы, указанная строкаPath)
{
//Виртуальный путь к корневому каталогу
строка virtualPath = page.Request.ApplicationPath;
//Абсолютный путь к корневому каталогу
строка pathRooted = HostingEnvironment.MapPath(virtualPath);
//Виртуальный путь к странице
строка pageVirtualPath = page.Request.Path;
если (!Path.IsPathRooted(specifiedPath) || заданныйPath.IndexOf(pathRooted) == -1)
{
throw new Exception(string.Format(""{0}"это виртуальный путь, а не абсолютный путь!", указанный путь));
}
// Преобразование в относительный путь
//(Тест показал, что pathRooted различается при работе на сервере с VS2005 и в корневом каталоге или виртуальном каталоге IIS.
// В некоторых местах после него будет добавлен "", в некоторых нет, просто примите решение на всякий случай)
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
УказанныйПуть = УказанныйПуть.Заменить(pathRooted, "/");
}
еще
{
УказанныйПуть = УказанныйПуть.Заменить(pathRooted, "");
}
string относительный путь = указанный путь.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/');
// Вычитаем последнюю страницу и предыдущее значение "";
int pageNodesCount = pageNodes.Length - 2
для (int i = 0; я <pageNodesCount; я++)
{
относительный путь = "/.." + относительный путь;
}
если (pageNodesCount > 0)
{
// Если существует "..", удаляем начальный "/"
относительныйПуть = относительныйПуть.Подстрока(1, относительныйПуть.Длина - 1);
}
Вернуть относительный путь;
}
Второй метод, очевидно, извлечен из первой части первого метода, поэтому мне лень добавлять соответствующие комментарии :P
Преобразуйте абсолютный путь на веб-сайте в виртуальный путь.
/**//// <сводка>
/// Конвертируем абсолютный путь под сайтом в виртуальный путь
/// Примечание. Те, что находятся на сайтах, не являющихся веб-сайтами, не будут преобразованы.
/// </сводка>
/// <param name="page">Указатель текущей страницы, обычно это</param>
/// <param name="specifiedPath">Абсолютный путь</param>
/// <returns>Виртуальный путь, тип: ~/</returns>
общедоступная статическая строка ConvertSpecifiedPathToRelativePath (страница страницы, указанная строкаPath)
{
строка virtualPath = page.Request.ApplicationPath;
строка pathRooted = HostingEnvironment.MapPath(virtualPath);
if (!Path.IsPathRooted(specifiedPath) || selectedPath.IndexOf(pathRooted) == -1)
{
вернуть указанный путь;
}
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
УказанныйПуть = УказанныйПуть.Заменить(pathRooted, "~/");
}
еще
{
УказанныйПуть = УказанныйПуть.Заменить(pathRooted, "~");
}
строка относительный путь = указанный путь.Replace("\", "/");
вернуть относительный путь;
}
О преобразовании виртуального пути в абсолютный путь говорить нечего. Метод HttpRequest.MapPath специально предназначен для этого.