2012-12-18 225 views
4

我已經通過使用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; 

我不知道如何解決這個問題。任何建議?

+0

發佈您的代碼在這裏 – VladL

+1

手動檢查文件的權限,並確保當前用戶有寫權限沒有設置適當的權限,當您創建該文件的文件。如果。 – pylover

+0

您不需要在帖子中添加簽名 - 您的用戶卡會自動添加。閱讀[常見問題](http://stackoverflow.com/faq#signatures)瞭解更多詳情。 – Artemix

回答

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的告訴你,你將不得不停止行駛在人行道和使用街道的意圖。

+0

謝謝你的合作。但是這裏有一點問題 - Path.Combine()不需要3個參數。它應該是 var path = Path.Combine(perUserAppData,「MyApp \\ MyFile.txt」); –

+1

[It sure does](http://msdn.microsoft.com/en-us/library/dd784047.aspx),可能只是與您的.Net版本不同。 – user7116

+0

yeap,我明白了。 –

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枚舉,你可以檢索到正確的完整路徑保證在不依賴於當前操作系統的情況下使用可讀寫的文件夾。

+0

非常感謝你:) – Ni3

0

作爲一種短期修復,可以使用ICACLS授予寫訪問該文件。注意:不是整個目錄。

作爲一個長期的修復,如果你正在運行的非特權用戶,你不應該寫程序目錄,而是地方,比如%LOCALAPPDATA%或%APPDATA%。