2012-04-03 34 views
2

我使用C#和.NET 3.5文件重定向

我節省下的文件我的程序數據:C:\程序數據\ MyProgramName \ filename.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「

確實有一個文件存在於以前的安裝中(我明顯沒有刪除,因爲我不知道它存在)。

因此,顯然在程序數據下有一些虛擬路徑。

編輯:

我發現,刪除舊文件中的虛擬商店後,我的應用程序突然能夠找到正確的文件。 (我沒有在計劃文件中的數據所做的任何更改

我的問題是:。

  1. 爲什麼會發生
  2. 我怎樣才能防止它發生

在此先感謝

回答

4

您是否實際上必須寫入到每個系統程序數據文件夾而不是每個用戶應用程序數據folde 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

您的卸載程序是否以管理員身份運行?如果確實如此,則可能必須檢查啓動卸載的用戶的VirtualStore路徑以及要刪除的程序數據的實際文件系統路徑。我不確定是否有官方的方式來做到這一點,雖然...

+0

是的。我必須......它應該在所有用戶之間分享。我正在使用Environment.SpecialFolder.ApplicationData獲取正確的路徑 – user844541 2012-04-03 15:55:00

+0

@ user844541 - 檢查我的編輯。我想知道這是否與此有關。首先 - – AKX 2012-04-03 16:07:05

+0

- 謝謝!事實是我在程序數據下有多個文件,但這是唯一被重定向的文件。關於你的猜測 - 這聽起來很合理,你指出了一個很好的理由,我會做更多的研究..非常感謝/ – user844541 2012-04-03 18:30:22

3

我找到了錯誤的原因。

應用程序試圖獲取文件的所有權,然後創建其他文件。

我刪除了該行,現在一切正常。