2

C#で記述されたアプリケーションがあり、アプリケーションのフロントエンドとバックエンドの両方から同じ接続文字列にアクセスするために、非表示のProgramDataに情報を書き込もうとしています。

次のようにパス変数を使用してディレクトリにアクセスしています。

private bool ProgramDataWriteFile(string contentToWrite)
        {
            try
            {

                string strProgramDataPath = "%PROGRAMDATA%";
                string directoryPath = Environment.ExpandEnvironmentVariables(strProgramDataPath) + "\\MyApp\\";
                string path = Environment.ExpandEnvironmentVariables(strProgramDataPath)+"\\MyApp\\ConnectionInfo.txt";

                if (Directory.Exists(directoryPath))
                {
                    System.IO.StreamWriter file = new System.IO.StreamWriter(path);
                    file.Write(contentToWrite);
                    file.Close();
                }
                else
                {
                    Directory.CreateDirectory(directoryPath);
                    System.IO.StreamWriter file = new System.IO.StreamWriter(path);
                    file.Write(contentToWrite);
                    file.Close();
                }

                return true;
            }
            catch (Exception e)
            {
            }
            return false;
        }

これは正しく機能しているようです。しかし、私の質問は、このパス変数を使用したときに、%AllUsersProfile%(%PROGRAMDATA%) 代わりに、不正な(そして冗長な)ファイルパスに展開されたということです:C:\ProgramData(C:\ProgramData)\ しかし、後者のパス変数は正しいフルネームだと思いました。間違って使っただけですか?この接続情報にすべてのユーザーがアクセスできるようにする必要がありますが、それを使用%PROGRAMDATA%するだけですか?関連する場合に備えて、Windows7を使用しています。

4

1 に答える 1

6

ここから:

FOLDERID_ProgramData / System.Environment.SpecialFolder.CommonApplicationData

ユーザーはエクスプローラーでここを参照することは決してありません。ここで変更された設定は、マシン上のすべてのユーザーに影響します。デフォルトの場所は、Windows Vistaのインストール時の隠しフォルダーである%systemdrive%\ProgramDataです。ディレクトリを作成し、インストール時に必要なACLを設定する必要があります。

したがって、を使用する%PROGRAMDATA%か、さらに良い方法を使用してください。

Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
于 2012-12-04T20:32:49.680 に答える