8

ASP クラシックでフル パスの仮想パスを取得するにはどうすればよいですか。完全なパスは仮想ディレクトリの下にある可能性があるため、単純化されていることに注意してください。

virtPath = Replace(fullPath, Server.MapPath("/"), "") 

メソッドは機能しません。

編集:明確にするために、例を次に示します

  • 完全な Windows ファイル パス (既知): \\MyServer\MyShare\Web\Site\Logs\Test.txt
  • 私の Web サイトには、 \\MyServer\MyShare\Web\Site\Logs\を指すLogsという仮想ディレクトリがあります。
  • 仮想パス (不明): /Logs/Text.txt
  • HTTP パス (不明、必要): http://Site/Logs/Test.txt
  • コードは、仮想ディレクトリの下ではなく、メイン アプリの asp ページにあります。問題のファイルとは別のサーバーにあります。
  • IIS6.0

    フル ファイル パスから仮想パスを見つけるにはどうすればよいですか?

4

6 に答える 6

14

誰かが興味を持っている場合に備えて、Anthony Jones の回答は、アプリケーションの相対ルートを一貫して取得する方法を示してくれました。したがって、http://example.comにサイトがあり、 http://localhost/exampleに同等のローカル開発がある場合、次の関数でルートを見つけることができます:

Function ToRootedVirtual(relativePath)
    Dim applicationMetaPath : applicationMetaPath = Request.ServerVariables("APPL_MD_PATH")
    Dim instanceMetaPath : instanceMetaPath = Request.ServerVariables("INSTANCE_META_PATH")
    Dim rootPath : rootPath = Mid(applicationMetaPath, Len(instanceMetaPath) + Len("/ROOT/"))
    ToRootedVirtual = rootPath + relativePath
End Function

次に、次のように呼び出してルート パスを取得できます。

ToRootedVirtual("/")

どちらが返されますか:

  • / example.com
  • /example/ 上の localhost/example

スラッシュなしでも使用できます。

ToRootedVirtual("")
于 2010-06-03T20:13:55.177 に答える
4

私が質問を理解した場合。

予測

フル パスは、現在のアプリケーションまたは子アプリケーション内のパスです。親に限定されたパスでも、兄弟アプリケーションへのパスでもありません。目的のパスは、現在のアプリケーション パスに対する相対パスです。

シナリオ 1

次のようなパス

"/someApp/someFolder/someSubFolder/file.ext"

それを解決する必要があります:-

"~/someFolder/someSubFolder/file.ext"

(ただし ~/ 表記は ASP クラシックが理解できるものではありません)。

シナリオ 2

"/someApp/someSubApp/SomeSubFolder/file.ext"

あなたはまだしたい:-

"~/someFolder/someSubFolder/file.ext"

シナリオ 3

アプリはサイトのルート アプリケーションです:-

「/someFolder/someSubFolder/file.ext」

まだなるだろう

"~/someFolder/someSubFolder.file.ext"

解決

これを解決する鍵は次のとおりです。

Dim sAppMetaPath : sAppMetaPath = Request.ServerVariables("APPL_MD_PATH")

上記の一連のシナリオでは、次のような結果になります。

  1. "/LM/W3SVC/33230916/ルート/someApp"
  2. "/LM/W3SVC/33230916/ルート/someApp/someSubApp"
  3. "/LM/W3SVC/33230916/ルート"

また

Dim sInstanceMetaPath: sInstanceMetaPath = Request.ServerVariables("INSTANCE_META_PATH")

すべてのシナリオで戻ります

"/LM/W3SVC/33230916"

いくつかの数学的削減により、関数に到達できます:-

Function ToAppRelative(virtualPath)

    Dim sAppMetaPath : sAppMetaPath = Request.ServerVariables("APPL_MD_PATH")
    Dim sInstanceMetaPath: sInstanceMetaPath = Request.ServerVariables("INSTANCE_META_PATH")

    ToAppRelative = "~/" & Mid(virtualPath, Len(sAppMetaPath) - Len(sInstanceMetaPath) - 3)

End Function
于 2009-05-20T20:10:13.497 に答える
0

まあ、私の答えはOrbManの答えよりも良くはありません...

すべてのインクルードが相対的であるようにアプリを整理しました...

あれは

\ myapp \ lib\somefile.aspの代わりに..\lib\somefile.aspを使用します

他の場合、私はオーブマンが言ったことをするだけです...

于 2009-05-20T17:40:15.280 に答える
0

これが、ASPを介してhtmlのルート関連パスを解決する方法です。これにより、サイトをさまざまなホスティングディレクトリに移植できます。

この小さなスニペットは、URLを設定するための正しいプレフィックスを生成します。

Mid(Request.ServerVariables("APPL_MD_PATH"),Len(Request.ServerVariables("INSTANCE_META_PATH"))+6)

これは、次のようにLINK、IMG、ハイパーリンクなどで使用できます。

<link href="<%= Mid(Request.ServerVariables("APPL_MD_PATH"),Len(Request.ServerVariables("INSTANCE_META_PATH"))+6) %>/assets/css/master.css" rel="stylesheet" type="text/css" />

したがって、パスをルート相対(/で始まる)になるようにコーディングしてから、このスニペットを最初のスラッシュの前、引用符の中に入れます。

于 2012-06-21T21:20:40.293 に答える
0

サーバーの仮想パスは次のとおりです。

<%Response.Write "http://" & Request.ServerVariables("server_name") &  
left(Request.ServerVariables("SCRIPT_NAME"),InStrRev(Request.ServerVariables("SCRIPT_NAME"),"/"))   %>
</p>
于 2013-03-26T11:34:10.213 に答える
0

より良い方法があるかもしれませんが、私は常に、仮想パスの一部ではないルート パスを手動で指定する構成変数を作成することでこれを行いました。これは、サイトがルートとして展開されるか、ルート Web のフォルダーの下に展開されるか、または仮想ディレクトリに展開されるかがわからないためです。

于 2009-05-20T14:20:11.253 に答える