よく使われる関数ですが、インターネット上で関連する解決策が見つかりませんでした。今日、プロジェクトアプリケーションの機会を利用して、絶対パスを仮想パスに変換する方法と、それらを仮想パスに変換する方法を書きました。指定されたページからの相対パス
/**//// <概要>
/// Web サイト内の絶対パスを、指定されたページを基準とした仮想パスに変換します
/// 概要>
/// 現在のページ ポインター、通常はこれ
/// 絶対パス
///
public static string ConvertSpecifiedPathToRelativePathForPage(ページ ページ、文字列指定パス)
{
//ルートディレクトリの仮想パス
文字列仮想パス = ページ.リクエスト.アプリケーションパス;
//ルートディレクトリへの絶対パス
文字列 pathRooted = HostingEnvironment.MapPath(virtualPath);
//ページの仮想パス
文字列 pageVirtualPath = page.Request.Path;
if (!Path.IsPathRooted(指定されたPath) || 指定されたPath.IndexOf(pathRooted) == -1)
{
throw new Exception(string.Format(""{0}" は仮想パスです。絶対パスではありません!", specificPath));
}
// 相対パスに変換
//(テストでは、VS2005 に付属のサーバー上で実行している場合と、IIS 下のルート ディレクトリまたは仮想ディレクトリで実行している場合では、pathRooted が異なるようであることがわかりました。
// 後ろに「」を付けるところもあれば付けないところもありますが、念のため判断してください)
if (pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
指定されたパス = 指定されたPath.Replace(pathRooted, "/");
}
それ以外
{
指定されたパス = 指定されたパス.Replace(pathRooted, "");
stringrelativePath = specificPath.Replace("\", "/");
string[] pageNodes = pageVirtualPath.Split('/');
//
最後のページと前の "" 値を減算します。
int pageNodesCount = pageNodes.Length - 2;
for (int i = 0; i < pageNodesCount; i++)
{
相対パス = "/.." + 相対パス;
if
(pageNodesCount > 0)
{
// ".." が存在する場合は、先頭の "/" を削除します
相対パス = 相対パス.サブストリング(1, 相対パス.長さ - 1);
相対パスを返します
。
2
番目のメソッドは明らかに最初のメソッドの最初の部分から抽出されたものなので、関連するコメントを追加するのが面倒です :P
Webサイト配下の絶対パスを仮想パスに変換する
/**//// <概要>
/// Web サイト下の絶対パスを仮想パスに変換します
/// 注: Web サイト以外のサイトにあるものは変換されません。
/// 概要>
/// 現在のページ ポインター、通常はこれ
/// 絶対パス
///
public static string ConvertSpecifiedPathToRelativePath(ページ ページ、文字列指定パス)
{
文字列 virtualPath = page.Request.ApplicationPath;
文字列 pathRooted = HostingEnvironment.MapPath(virtualPath);
if (!Path.IsPathRooted(指定されたPath) ||指定されたPath.IndexOf(pathRooted) == -1)
{
指定されたパスを返します。
if
(pathRooted.Substring(pathRooted.Length - 1, 1) == "\")
{
指定されたパス = 指定されたPath.Replace(pathRooted, "~/");
}
それ以外
{
指定されたパス = 指定されたPath.Replace(pathRooted, "~");
文字
列相対パス = 指定されたパス.Replace("\", "/");
相対パスを返します。
HttpRequest.MapPath
メソッドは、これを行うために特別に設計されています。