2012-04-03 9 views
22

私は単純な問題があります。私はそれが現在に%userprofile%を追加しようとするため、それがエラーを吐くファイルc#ファイルを開く、%userprofile%で始まるパス

​​

としてそれを開こうとすると

%USERPROFILE%\AppData\Local\MyProg\settings.file 

:私はこのようになり、ユーザーディレクトリ内のファイルへのパスを持っていますディレクトリ、それは次のようになります。

C:\Program Files\MyProg\%USERPROFILE%\AppData\Local\MyProg\settings.file 

は、どのように私はそれが%USERPROFILE%で始まるパスは絶対的ではなく、相対パスであることを認識させるのですか?

PS:私はちょうどその名前でファイルを開く必要がありますので、私は

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

を使用することはできません。ユーザーが名前を指定します。ユーザーが "settings.file"を指定した場合は、プログラムのディレクトリを基準にファイルを開く必要があります。ユーザーが%USERPROFILE%で始まるパスを指定している場合や、C:\に変換するその他のものを開く必要があります。

答えて

45

使用する前に、パス上にEnvironment.ExpandEnvironmentVariablesを使用してください。

var pathWithEnv = @"%USERPROFILE%\AppData\Local\MyProg\settings.file"; 
var filePath = Environment.ExpandEnvironmentVariables(pathWithEnv); 

using(ostream = new FileStream(filePath, FileMode.Open)) 
{ 
    //... 
} 
+0

'Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)'だけではないのはなぜですか? –

+1

これはより一般的です - 渡される環境変数は常に '%USERPROFILE%'になると仮定しています。 (これは質問が求めているものです - 環境変数を拡張することを求めています - 使用されている例はユーザープロファイルが付随的であるということです)。 – Oded

+0

ああ、そうです。 OPが与えた悪い例 –

5

使用Environment.ExpandEnvironmentVariables静的メソッドは:

string fileName= Environment.ExpandEnvironmentVariables(fileName); 
ostream = new FileStream(fileName, FileMode.Open); 
+1

ストリームに 'using'ステートメントを使うのを忘れないでください。 – Oded

-1

また、Environment.Username定数を使用することもできます。 %USERPROFILE%とこの環境変数の両方が同じ(現在ログに記録されているユーザー)を指しています。しかし、この方法を選択した場合は、パスを自分で連結する必要があります。

+1

さて、私は忘れてしまった、少し違いがあります。環境変数は "C:\ Users \ {username}"を意味し、その他のものは "{username}" – NeverJr

+4

のみです。ユーザ名はユーザプロファイルのフォルダ名と同じではないかもしれません。 (フォルダが既に存在し、同じ名前の新しいユーザーが作成されている場合 - Windowsは新しいフォルダ名を選択します) – HelloSam

0

私はユーティリティライブラリでこれを使用しています。

using System; 
namespace Utilities 
{ 
    public static class MyProfile 
    { 
     public static string Path(string target) 
     { 
      string basePath = 
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + 
@"\Automation\"; 
      return basePath + target; 
     } 
    } 
} 

です。 "string testBenchPath = MyProfile.Path(" TestResults ");"

関連する問題