web-dev-qa-db-ja.com

アプリケーション固有のデータフォルダー(ProgramData)を取得するにはどうすればよいですか?

すべてのユーザー間で共有される、アプリケーション固有のデータを含むファイルの読み取りと書き込みが必要です。

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)を使おうとしましたが、C:\ ProgramDataしか返されません。

私の質問は:

アプリケーション名とバージョンに応じて、書き込む正確なフォルダーを提供するPath.GetDirectoryName(Application.UserAppDataPath)のようなシステムは存在しますか?

またはProgramDataそれを行うのに適切な場所ではありません。

ありがとう。

9
paulinodjm

Path.GetDirectoryName(Application.UserAppDataPath)のようなシステムが存在します。これにより、アプリケーション名とバージョンに応じて、書き込む正確なフォルダーが提供されます。

いいえ、少なくともWindows 7で実行している場合は存在しません(Windows 8/WinRT/Windowsストアアプリについてはわかりません)。実行可能な解決策は、Environment.GetFolderPath(...)出力をアプリケーションのカスタムパスと連結することです。通常、衝突の可能性を減らすために、それはYourOrganization\YourApplicationまたはYourFullName\YourApplicationのようなものであり、バージョンを追加することもあります。

または、ProgramDataはそれを行うのに適切な場所ではありません。

これは、アプリケーション全体の情報をディスクに保存するのに適した場所です。アプリケーションに関連し、マシンにログオンしているWindowsユーザーごとに異なる情報は、代わりに<User folder>\AppData\Roaming\...または<User folder>\AppData\Local\...に移動する必要があります。

注意:誰かがすでにコメントで述べているように、通常、内部で作業するには管理者権限が必要ですC:\ ProgramData ...、したがって、インストールフェーズ中に、ProgramData内にフォルダーを作成し、適切なアクセス許可を与えるセットアッププロジェクトを準備する必要があります。

4
superjos

CommonApplicationDataは、ユーザーにバインドされていないすべてのアプリケーションのグローバルフォルダーであるため、まさにあなたが探しているものだと思います。

var commonpath = GetFolderPath(SpecialFolder.CommonApplicationData);
var path = Path.Combine(commonpath, "YourAppName\\YourApp.exe");
try { 
    Process.Start(path);
    // or put data there or whatever
} 
catch (Exception ex)
{
    MessageBox.Show(path);
}

ユーザーバインドデータ用のSpecialFolder.LocalApplicationDataもあります。

3
Akku