web-dev-qa-db-ja.com

Server.MapPathを使用してASP.NETのWebサイトフォルダー外の場所を取得する方法

ASP.NETサイトでドキュメント(XMLなど)を使用する場合、通常は次のようにドキュメントを読み込みます。

Server.MapPath("~\Documents\MyDocument.xml")

ただし、DocumentsフォルダーをWebサイトフォルダーの外に移動して、Webサイトフォルダーの兄弟になるようにします。これにより、ドキュメントの保守が大幅に容易になります。

ただし、ドキュメントのロードコードを次のように書き直します。

Server.MapPath("../../Documents/MyDocument.xml")

その結果、ASP.NETから「トップディレクトリの上に出ることができない」という苦情が寄せられます。

それで、誰が私がウェブサイトフォルダの外のフォルダの場所を相対的に指定できるかを提案できますか?明らかな展開上の理由から、絶対パスを指定したくありません。

ありがとう

ダビデ

12
David

Webルートとの相対位置がわかっている場合は、Server.MapPathを使用してWebルートの物理的な場所を取得してから、 Path class のメソッドを使用してドキュメントパスを取得できます。

大まかな未チェックのコードでは、次のようになります。

webRootPath = Server.MapPath("~")
docPath = Path.GetFullPath(Path.Combine(rootPath, "../Documents/MyDocument.xml"))

構文が間違っている場合は申し訳ありませんが、Pathクラスは、Webタイプのパスではなく実際のFSパスでプレイするために必要なものです。

メソッドが失敗した理由は、Server.MapPathがWebサーバー上の場所を取得し、サーバー階層のルートの最上位にあるため、指定した場所が無効であるためです。

27
Chris
docPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\Documents\MyDocument.xml");

AppDomain.BaseDirectory 現在のWebアプリケーションアセンブリディレクトリパスを返します。

5
Tadas Šukys

絶対または相対のいずれかの場合にパスを解決する必要がある場合(Webアプリのルートフォルダーの外部でも)、これを使用します。

public static class WebExtesions
{
    public static string ResolveServerPath(this HttpContextBase context, string path) {
        bool isAbsolute = System.IO.Path.IsPathRooted(path);
        string root = context.Server.MapPath("~");
        string absolutePath = isAbsolute ? 
                                    path : 
                                    Path.GetFullPath(Path.Combine(root, path));
        return absolutePath;
    }
}
1
cleftheris

ハードドライブのどこかに場所を指定したい場合、それはWeb環境では簡単に利用できません。ファイルのサイズと量が小さい場合は、ファイルをディレクトリ内に保持して、〜/ path untildirectoryを使用してポイントできます。

ただし、以前はRequestオブジェクトを使用していた場合もあります。詳細については、このリンクをご覧ください

http://msdn.Microsoft.com/en-us/library/5d5940ad.aspx

0
user240141