ASP.NETの外部C#クラスでServer.MapPathを使用する


132

C#クラスの特定のファイルの絶対パスを取得しようとしています。 Server.MapPathもちろんASPXとそのコードビハインドページには適していますが、別のクラスファイルには存在しません。を試しましたHostingEnvironment.MapPath()が、相対仮想パスが許可されていないというメッセージが表示されます。何かご意見は?

System.Web はすでにインポートされています。

回答:


302

ServerUtilityこのクラスは、あなたの中にインスタンスとして使用可能ですHttpContext。ASP.Netパイプライン内で実行されることがわかっている環境にいる場合は、

HttpContext.Current.Server.MapPath()

System.Webただし、インポートする必要があります。


1
この投稿は2年以上前のものですが、あなたはものすごく助けてくれました。ありがとう。
iarwain01 2011

6
そのパイプラインで実行されない場合はどうなりますか?
zaitsman 2013

ASP.Net内で実行していない場合は、独自のパイプラインを作成しない限り、HttpContextが設定されている可能性は低いです。実行コンテキスト(ルーター?)が提供するメソッドに依存する必要があります。プロセスがパスルーティングの基本を理解している場合は、System.IO.Pathメソッドを確認できます。
2016

これはコンパイルされていますが、コントローラーの外ではコンテキストがnullなので、コードエラーが発生します。wompも同じことを言っていると思います。その場合、ルーターの外でMapPathにアクセスできますか?
エデンコルビン

34

あなたも使うことができます:

var path = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/myfile.txt")

もし

var path = Server.MapPath("~/App_Data");
var fullpath = Path.Combine(path , "myfile.txt");

アクセスできません


8

あなただけへの参照を追加することはできませんSystem.Webし、あなたが使用することができますかServer.MapPath

編集:最近では、HostingEnvironment.MapPathメソッドの使用をお勧めします:

これはSystem.Web、仮想パスをサーバー上の物理パスにマップするアセンブリの静的メソッドです。それはしませんへの参照が必要ですHttpContext


外部クラスにはありません。
funwhilelost

もちろん、参照を外部クラスに追加できます。ただし、明らかにサーバー要求のコンテキストで使用する必要があるため、HttpContextはnullではありません。
Dan Diplo、2010

4
System.Reflection.Assembly.GetAssembly(type).Location

取得しようとしているファイルが型のアセンブリの場所である場合。ただし、ファイルがアセンブリの場所に関連している場合は、これをSystem.IO名前空間と共に使用して、ファイルの正確なパスを取得できます。


-1:彼がアセンブリの場所を望んでいると思ったのはなぜですか?
ジョンサンダース

1
彼は「特定のファイル」と言い、ファイルの場所や性質を指定しなかったため、アセンブリの場所を知っていて、そのパスを基準にして作業できることが役立つ場合があります。もちろん、もし彼がまだHttpContextにいると実際に言っていたら、私は答える気になりませんでした。
デビッドマキューイング

David McEwing、あなたが提案したことは、IISがアセンブリをインストールした場所(Webサイト内)からアセンブリをロードしないため機能しません。これらは一時的なasp.netキャッシュの場所からコピーおよびロードされるため、GetAssemblyまたはGetExecutingAssemblyを実行すると、アセンブリの場所が示されますが、MapPathが指すWebサイトの場所とは関係ありません。
zumalifeguard 2014年


3
class test
{
public static void useServerPath(string path)
{
   if (File.Exists(path)
{
 \\...... do whatever you wabt
}
else
{
\\.....
}
}

コードビハインドからメソッドを呼び出すと

例えば ​​:

protected void BtAtualizacao_Click(object sender, EventArgs e)
        {
             string path = Server.MapPath("Folder") + "\\anifile.txt";

            test.useServerPath(path);
}

このようにして、コードはシンプルになり、1つのメソッドで、呼び出しごとに複数のパスを使用できます:)


3

これは私に役立ちました

//System.Web.HttpContext.Current.Server.MapPath //        
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"),
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

Stackoverflowへようこそ。もう少し説明すると、他のプログラマーがソリューションがうまくいった理由を理解するのに役立ちます。
NJInamdar 2014

1

ASP.NETのコンテキスト内で実行しているかどうかにかかわらず、HostingEnvironment.ApplicationPhysicalPathを使用できるはずです。


0

server.mappath( "")は、aspxページで機能します。クラスファイルから絶対パスを取得するには、これを使用する必要があります。

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.