5

VS2008セットアッププロジェクトを使用して.msiを作成しました。私のアプリケーションは、アプリケーションディレクトリ(C:\ Program Files \ MyApp \ MyFile.txt)の.txtファイルに値を書き込むことがよくあります。Win7にインストールした後、「パスへのアクセスが拒否されました」という例外が発生します。

しかし、管理者として実行するときはいつでも、そのような例外は発生しません。これが私のsscceです

string FilePath=Application.StartupPath + @"\AppSettings\CurrentUserName.inf";
using (StreamWriter writer=new StreamWriter(FilePath,false))
{
    writer.Write(txtLoginName.Text.Trim());
}
MainForm.ProcessLogIn();
this.DialogResult = DialogResult.OK;

この問題を解決する方法がわかりません。なにか提案を?

4

3 に答える 3

8

ファイルを Program Files ディレクトリから移動します。Win7 では、通常のユーザーは読み取り専用です。

ファイルを ProgramData ディレクトリに移動できます。
インストーラーは、そこにアプリケーションのディレクトリを作成する必要があります。
次に、コード内で、これらのコード行を使用して正しいフルパス名を取得できます

string dataPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData));
string appFile = Path.Combine(dataPath, "MyAppDir", "MyFile.txt");

通常(Win7で)これは次のようなパスになります

c:\programdata\MyAppDir\MyFile.txt

ただし、SpecialFolder列挙型を使用すると、現在のオペレーティング システムに依存せずに、アプリケーションに対して読み書き可能なフォルダーを使用することが保証されます。

于 2012-12-18T14:19:18.057 に答える
5

この問題を解決する唯一の方法は、そのフォルダーに書き込みをしないことです。慣例により、そのフォルダーへの書き込みは許可されていません。残念ながら、古いバージョンの Windows ではこれを行うことができませんでした。

代わりに、Environment.SpecialFolderどこに行く必要があるかを見つけるのに役立ちます:

// your application data for just that User running the app
var perUserAppData = Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData);

// your application data for ALL users running the app
var allUsersAppData = Environment.GetFolderPath(
    Environment.SpecialFolder.CommonApplicationData);

// better!
var path = Path.Combine(perUserAppData, @"MyApp\MyFile.txt");

基本的に、Windows 7 は、歩道での運転を停止し、意図したとおりに通りを使用する必要があることを示しています。

于 2012-12-18T14:20:55.983 に答える
0

短期的な修正として、ICACLS を使用してファイルへの書き込みアクセスを許可できます。注: ディレクトリ全体ではありません。

長期的な修正として、特権のないユーザーとして実行している場合は、プログラム ディレクトリに書き込むべきではなく、代わりに %LOCALAPPDATA% や %APPDATA% などの場所に書き込みます。

于 2012-12-18T14:20:19.617 に答える