C#は%AppData%のパスを取得します


387

C#2008 SP1

以下のコードを使用しています:

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

ただし、アプリケーションが実行されている場所を指す例外が発生します。

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

%AppData%は相対パスを見つけるべきだと思いました。Start|Run|%AppData%Windowsエクスプローラーに行くと、そのディレクトリに移動します。

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

回答:


802

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

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

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

%AppData%は環境変数であり、.NETのどこにも自動的に展開されませんが、Environment.ExpandEnvironmentVariableメソッドを使用して明示的に展開できます。GetFolderPathただし、ヨハネスロッセルがコメントで指摘している%AppData%ように、特定の状況では設定されない場合があるため、使用することを強くお勧めします。

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

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

45
+1は、環境に依存せずに、実際のソリューションを提供します。答えを追加するには:ファイル名を処理するすべての関数が環境変数を展開するわけではありません。実際、通常はこれを明示的に行う必要があります。そうしないと機能せず、%something%フォルダが作成されます。さらに、環境が存在する必要はありません。別のユーザーアカウントでプログラムを実行する場合、ユーザーの環境が読み込まれず、%Appdata%が空になることがあります。ドキュメント化されたAPIを使用してこれらのフォルダーを取得するのはこのためです(ただし、バッチファイルを使用している場合は除きます)。
Joey、

@ヨハネス:そこに良い情報。私はあなたがそれを投稿したときに私の回答を修正しましたが、GetFolderPathがExpandEnvironmentVariableよりも明らかに好ましいことを明確にします。
ノルドリン2009年

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)の+1、私は数日間これの後ろにいました。
Sumit Ghosh 2010年

1
何らかの理由でEnvironment.GetFolderPath(Environment.SpecialFolder.ApplicationData)空の文字列が返されます(IIS 7、VS 2011)。Simon_Weaverソリューションを使用して解決された問題-を使用しMapPathたマッピング。
マイク・ケスキノフ

52
ローカルAppData Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)のローミングディレクトリを提供するFYI
roundcrisis

49

ASP.NETの場合は、パスが異なります。

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

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

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

(注:MVCコントローラーの 'Current'プロパティは必要ありません)

に到達するためのもう一つの「抽象的な」方法がある場合は、そのApp_Data方法を聞きたいです。


asp.netコアがリリースされるので、ちょっと注意してください。このアプローチは、特にIISに依存しています。
George Mauer

7
HostingEnvironment.MapPath(@"~/App_Data")より優れており、HttpContextがないMVC / WebAPIとWCFコンテキストの両方で機能しますが、コアについては不明です '
Simon_Weaver

37

BESTのAppDataディレクトリを使用する方法は、ISを使用する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

環境変数が設定されていない場合、それはあなたのせいではありません(それがいつであるかを除いて)。私は通常に人々を教えていないではない、私は最初、他の道を行き、それが悪い考えだったことに気づいた後、再発明ホイールけど。


path変数の例が気に入りました:)
RBT

Environment.ExpandEnvironmentVariableパス文字列に含まれる可能性のある環境変数に関係なく、単に展開する必要がある場合は、+ 1 が最適です。
blins 2018年

24

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

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

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


15

.net2.0では、変数を使用できます Application.UserAppDataPath


20
これはWinformsのみです。

7

そのような文字列に%AppData%を入れても機能しないと思います。

試す

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

4

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

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

正しい答えではないかもしれませんが、それが私が探していたものです。+1
デリック

一重引用符を二重引用符に置き換えた後、私のために働きました。Path.Combine(HttpRuntime.AppDomainAppPath、 "App_Data")
ajaysinghdav10d

1

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

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

1

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

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