web-dev-qa-db-ja.com

C#が%AppData%のパスを取得

C#2008 SP1

私は以下のコードを使っています。

dt.ReadXml("%AppData%\\DateLinks.xml");

しかし、私は自分のアプリケーションが実行されている場所の場所を指す例外を受け取っています。

パス「D:\ Projects\SubVersionProjects\CatDialer\bin\Debug \%AppData%\ DateLinks.xml」の一部が見つかりませんでした。

%AppData%は相対パスを見つけるべきだと思いました。 Start|Run|%AppData%ウィンドウズエクスプローラは私をそのディレクトリに連れて行きます。

ユーザーは各クライアントマシンで異なるため、フルパスを入力することはできません。

351
ant2009

AppDataディレクトリを取得するには、GetFolderPathメソッドを使用するのが最善です。

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

(存在しない場合はusing Systemを追加する必要があります)。

%AppData%は環境変数であり、.NETの任意の場所で自動的に展開されるわけではありませんが、明示的に Environment.ExpandEnvironmentVariable メソッドを使用して実行できます。 JohannesRössel氏がコメントで指摘しているように、特定の状況では%AppData%を設定できない可能性があるため、GetFolderPathを使用することを強くお勧めします。

最後に、例に示すようにパスを作成します。

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml");
730
Noldorin

あなたがASP.NETを話しているならば、パスは異なります。

ASP.NETの/ App_Dataを指す 'SpecialFolder'値が見つかりませんでした。

代わりにこれを行う必要があります。

 HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data")  

(注:MVC Controllerでは 'Current'プロパティは必要ありません)

App_Dataに到達するための別の「抽象的な」方法があるならば、その方法を聞きたいのです。

48
Simon_Weaver

AppDataディレクトリを使用するBESTを使用するEnvironment.ExpandEnvironmentVariable メソッド.

理由:

  • 文字列の一部を有効なディレクトリなどに置き換えます。
  • 大文字と小文字は区別されません
  • それは簡単で簡単です
  • それは標準です
  • ユーザー入力を扱うのに適しています

例:

string path;
path = "%AppData%\stuff";
path = "%aPpdAtA%\HelloWorld";
path = "%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths

path = Environment.ExpandEnvironmentVariables(path);
Console.WriteLine(path);

%AppData%%appdata%%APpData%と入力したユーザーがいることを忘れないでください。

if (path.ToLower().StartsWith("%appdata%"))
    ; // path manipulation
if (path.ToLower().StartsWith("%programfiles%"))
    ; // path manipulation

環境変数が設定されていなければ、それはあなたのせいではありません(それがの場合を除く)。私はたいていの人にホイールを作り直さないようにしないように言うわけではありませんが、私が最初に他の方法を試した後でそれが悪い考えであることに気付きました。

28
Bitterblue

また使用することができます

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml");

%AppData%変数を展開します。

22
parapet

.net2.0では変数Application.UserAppDataPathを使うことができます

15
Nathan

そのような文字列に%AppData%を入れてもうまくいくとは思いません。

やってみる

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString()
6
danswain

誰かがこれを必要とする場合に備えて、私のMVCアプリケーションの「App_Data」フォルダにアクセスする別の方法を共有したいと思っただけです。

 Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data")
3
cpoDesign

ASP.NETでは、Load User Profile設定をアプリプールに設定する必要がありますが、それだけでは不十分です。 \Windows\System32\inetsrv\Config\applicationHost.configにはsetProfileEnvironmentという名前の隠し設定があります。これは、何らかの理由で ドキュメント で説明されているように、デフォルトではオフになっています。デフォルトを変更するか、アプリプールに設定することができます。 Environmentクラスのすべてのメソッドは適切な値を返します。

1
MoonStom

これはコンソールアプリケーションで私のために働いています -

string appData = System.Environment.GetEnvironmentVariable("APPDATA");
1
Bill