2009-05-15 12 views
295

C#2008 SP1C#が、私は以下のコードを使用しています%APPDATA%

のパスを取得しますFrom:

パス ':\プロジェクト\ SubVersionProjects \ CatDialer \ binに\デバッグ\%APPDATA%\ DateLinks.xml D' の一部が見つかりませんでした。

私は%AppData%が相対パスを見つけるべきだと考えました。私が行くときStart|Run|%AppData% Windowsエクスプローラは、そのディレクトリに私を連れて行く。

ユーザーがクライアントマシンごとに異なるため、完全なパスを入力できません。

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

%AppData%は環境変数であり、それらは自動的にどこにも展開されていません。のAppDataディレクトリを取得するために、任意のアドバイスを

多くのおかげで、

答えて

635

は、それがGetFolderPathメソッドを使用するのが最善です.NETでは、Environment.ExpandEnvironmentVariableメソッドを明示的に使用することはできますが、そうすることができます。しかし、私はまだGetFolderPathを使用することを強くお勧めします。なぜなら、JohannesRösselがコメントで指摘したように、特定の状況で%AppData%が設定されない可能性があるからです。

最後に

、あなたの例のようにパスを作成するには:

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

+1環境に頼らず、真の解決策を提供します。答えに追加するには:ファイル名を扱うすべての関数が環境変数を拡張するわけではありません。実際には、通常は明示的にこれを行わなければなりません。そうでなければ動作せず、%something%フォルダになります。さらに、環境が存在する必要はなく、別のユーザーアカウントでプログラムを実行すると、ユーザーの環境が読み込まれず、%Appdata%が空になることがあります。そのため、文書化されたAPIを使用してこれらのフォルダを取得する必要があります(ただし、バッチファイルを使用している場合を除きます)。 – Joey

+0

@Johannes:良い情報があります。私はあなたがそれを投稿したときに私の答えを修正したばかりですが、GetFolderPathがExpandEnvironmentVariableよりも確実に望ましいことを明確にします。 – Noldorin

+0

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

6

を私はそのような文字列に入れて、%APPDATA%が動作するとは思いません。

はあなたにも%AppData%変数を展開する

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

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

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

してみてください。

43

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

ASP.NETの/ App_Dataを指している「SpecialFolder」値が見つかりませんでした。

は、その代わりに、これを実行する必要があります。

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

(注:MVCコントローラで「現在の」プロパティを必要としない)を取得するために

theresの場合は、別のより「抽象的」な方法をApp_Dataにはどのように聞くのが大好きです。

+0

asp.netコアが出てくるのでちょっとメモしておきます。このアプローチは、特にIISに依存しています。 –

+3

'HostingEnvironment.MapPath(@"〜/ App_Data ")'はMVC/WebAPIとHttpContextが存在しないWCFコンテキストの両方で動作しますが、コアについてはわかりません。 ' –

13

.net2。0あなたがのAppDataディレクトリを使用する変数Application.UserAppDataPath

+19

これはWinformsのみです。 – Will

20

BESTの方法を使用することができ、Environment.ExpandEnvironmentVariableメソッドを使用するです。

理由:

  • それが有効なディレクトリを使用して文字列の一部を置き換えるか、それは、標準
  • 良いです
  • 簡単かつ単純である、大文字と小文字を区別しない
  • は何でも
  • ユーザ入力を扱うために

例amples:

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

環境変数が設定されていない場合、それはあなたではありません。

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% を入力し忘れないでください障害(それ以外の場合は)。私は通常、人々にを教えていません私は最初に他の方法を行って、それが悪い考えであることに気づいた後、ホイールを再発明します。

+0

あなたの 'path'変数の例を参考にしてください:) – RBT

3

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

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

正解ではないかもしれませんが、私が探していたものです。 +1 – Derrick

+0

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

+0

@ ajaysinghdav10d良い点私は自分の答えを更新しました – cpoDesign

関連する問題