4

.net 3.5でC#を使用しています

プログラムデータをC:\ Program Data \ MyProgramName\fileName.xmlの下のファイルに保存しています。

アプリケーションを一度インストールして実行した後、アンインストールし(アンインストール中に「プログラムデータ」からすべてのファイルを削除します)、アプリケーションを再インストールして実行しました。

奇妙なことに、私のアプリケーションは、プログラムデータ内のファイルが存在するかのように起動しました。つまり、データファイルが削除されても、アプリ内に古いデータがありました。

実行時:

File.Exists("C:\Program Data\MyProgramName\fileName.xml")

ファイルが存在しないことは確かにわかっていましたが、「true」になりました。

アプリケーションを管理者として実行した後、ファイルが存在しなかった場合、状況はさらに奇妙になりました。

調査の結果、「C:\ Program Data \ MyProgramName \ fileName.xml」を取得する代わりに、管理者権限なしでアプリケーションを実行すると、「C:\ Users \ userName \ AppData \ Local \ VirtualStore\ProgramData」が取得されることがわかりました。 \ MyProgramName \ fileName.xml "

そして確かに、以前のインストールから存在したファイルがありました(それが存在することを知らなかったので、私は明らかに削除しませんでした)。

したがって、明らかに、プログラムデータの下にファイルへの仮想パスがあります。

編集 :

仮想ストア内の古いファイルを削除した後、アプリケーションが突然正しいファイルを見つけることができることがわかりました。(プログラムデータの下のファイルには変更を加えませんでした。

私の質問は:

  1. なぜそれが起こるのですか。
  2. どうすればそれを防ぐことができますか

前もって感謝します

4

2 に答える 2

5

実際には、ユーザーごとのアプリケーションデータフォルダーではなく、システムごとのプログラムデータフォルダーに書き込む必要がありますか?

Environment.GetFolderPath次の内容を確認することをお勧めしますEnvironment.SpecialFolder

  • Environment.SpecialFolder.ApplicationData-アプリケーションデータ用のデータフォルダー。ユーザープロファイルがローミングしている場合は、ドメインコントローラーに同期されます。
  • Environment.SpecialFolder.LocalApplicationData-アプリケーションデータ用のデータフォルダ、ローカルで同期されていない(たとえば、キャッシュに役立ちます)

編集:

管理者以外のユーザーであるWindows7x64でテスト済み。

var appData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
var myFolder = Path.Combine(appData, "MyApp");
if(!Directory.Exists(myFolder)) Directory.CreateDirectory(myFolder);
File.WriteAllText(Path.Combine(myFolder, "Test.txt"), "Test.");

これは期待されることを行います。に書き込みますC:\ProgramData\MyApp\Test.txt。私が知る限り(管理者モードのコマンドプロンプト)、UAC仮想化も実行されていません。

二重編集:

何が起こったのかと思うと、ある時点で管理者ユーザーがファイルをProgramDataフォルダーに書き込んだため、UACファイルシステムの仮想化が開始され、管理者以外の書き込みがにリダイレクトされますVirtualStore

アンインストーラーは管理者として実行されますか?その場合はVirtualStore、アンインストールを開始したユーザーのパスと、削除するプログラムデータの実際のファイルシステムパスの両方を確認する必要があります。これを行う公式の方法があるかどうかはわかりませんが...

于 2012-04-03T15:42:39.140 に答える
3

バグの理由を見つけました。

アプリケーションがファイルの所有権を取得しようとすると、他のファイルが作成されます。

その行を削除すると、すべてが正常に機能するようになりました。

于 2012-04-15T10:52:47.367 に答える