2012-04-03 3 views
2

私は下のファイルで私のプログラムデータを保存しています.NET 3.5ファイルリダイレクト

とC#を使用しています:C:\プログラムデータ\ MyProgramName \ファイル名.xmlを

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

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

ランニング:

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

を私は、ファイルが存在しないことを確かに知っていたにも関わらず、「真」です。

私は管理者としてアプリケーションを実行した後、ファイルが存在しなかったことが見知らぬものになりました。

調査の結果、「C:\ Program Data \ MyProgramName \ fileName.xml」を取得するのではなく、管理者権限なしでアプリケーションを実行すると、「C:\ Users \ userName \ AppData \ Local \ VirtualStore \ ProgramData \ MyProgramName \ fileName.xml "

実際、以前のインストールのファイルがありました(削除されていなかったため、存在していなかったため)。

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

EDIT:

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

私の質問は:

  1. は、なぜそれが起こるのである
  2. 私は

を起こってからそれを防ぐにはどうすればよいです。事前にお礼します

答えて

4

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

あなたはEnvironment.GetFolderPathを見て、次のEnvironment.SpecialFolder S取りたいかもしれません:

  • Environment.SpecialFolder.ApplicationDataを - ユーザープロファイルが
  • Environment.SpecialFolder.LocalApplicationDataをローミングしている場合は、ドメインコントローラ上に同期アプリケーションデータのためのデータフォルダー、 - データフォルダアプリケーションデータの場合、ローカルおよび非同期(キャッシュなどに便利)

編集:

Windows 7 x64、管理者以外のユーザーでテスト済みです。

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に書き込みます。

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

+0

はい。私は....すべてのユーザーの間にshaerdする必要があります。私はEnvironment.SpecialFolder.ApplicationDataを使用して正しいパスを取得しています – user844541

+0

@ user844541 - 私の編集を確認してください。私はそれがこれと何か関係があるのだろうかと思います。まずは – AKX

+0

- ありがとう!実際には、プログラムデータの下に複数のファイルがありますが、それはリダイレクトされる唯一のファイルです。あなたの推測について - それは合理的だと思う、あなたはそれが起こるための正当な理由を指摘..私はいくつかのより多くの研究を行うだろう..ありがとう/ – user844541

3

私はバグの理由を発見しました。

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

私はその行を削除しましたが、すべて正常に動作します。

関連する問題