3

デスクトップアプリとasp.netWebサイトの両方で使用されるアセンブリがあります。

どちらの状況でも、相対パス(URLではなくローカルファイル)を処理する必要があります。

このメソッドを実装するにはどうすればよいですか?

string ResolvePath(string path);

Web環境では、idは、メソッドが次のように動作することを期待しています(d:\wwwroot\mywebsiteiisが指すフォルダーはどこにありますか)。

/folder/file.ext => d:\wwwroot\mywebsite\folder\file.ext
~/folder/file.ext => d:\wwwroot\mywebsite\folder\file.ext
d:\wwwroot\mywebsite\folder\file.ext => d:\wwwroot\mywebsite\folder\file.ext

デスクトップ環境の場合:(. c:\program files\myprogram\bin\exeのパスはどこにありますか)

/folder/file.ext => c:\program files\myprogram\bin\folder\file.ext
c:\program files\myprogram\bin\folder\file.ext => c:\program files\myprogram\bin\folder\file.ext

IPathResolver実行中の状態に応じて異なるものを注入したくありません。

自分がいる環境をどのように検出し、相対的な可能性のあるパスを解決するために、それぞれの場合に何をする必要がありますか?

ありがとう

4

3 に答える 3

5

元の質問には答えていないと思います。

"..\..\data\something.dat" が必要だと仮定して、"D:\myApp\source\bin\" に実行可能ファイルがあるとします。使用する

System.IO.Path.Combine(Environment.CurrentDirectory, relativePath);

これは単に文字列を連結するだけで簡単に取得できます。結合はパスを解決しません。末尾のバックスラッシュやその他の些細なことを処理します。彼はおそらく実行したい:

System.IO.Path.GetFullPath("D:\myApp\source\bin..\..\data\something.dat");

解決されたパスを取得するには: "D:\myApp\data\something.dat".

于 2011-07-08T18:07:27.357 に答える
2

Webサイトのバイナリは、アプリケーションの実行時に一時フォルダーにコピーされるため、通常、実行中のアセンブリから相対パスを取得することはできません。

これは賢明な方法ではないかもしれませんが、この問題を解決するために私がしたことは次のようなものでした。

if (filepath.StartsWith("~"))
{
   filepath = HttpContext.Current.Server.MapPath(filepath);
}
else
{
  filepath = System.IO.Path.Combine(Environment.CurrentDirectory, filepath);
}

これは、Webバージョン(相対パスの先頭に〜が付いている)では、それがweb.configからのものかApp.configからのものかがわかるためです。

于 2012-02-27T22:16:05.777 に答える
1

ジョンのコメントで述べたように、何に対して?メソッドを使用System.IO.Path.Combineして、次のようにベース パスと相対パスを組み合わせることができます。

 System.IO.Path.Combine(Environment.CurrentDirectory, relativePath);

Environment.CurrentDirectory上記の行は、必要な基本パスに置き換えることができます。

基本パスを構成ファイルに保存できます。

于 2009-06-22T16:37:28.870 に答える