2017-09-13 27 views
1

enter image description here我在做什麼錯了?訪問被拒絕!?我無法從C驅動器上的安裝文件夾中打開文件

我有一個讀取/複製/寫入過程,用於訪問隨軟件一起安裝的文件夾。

測試版本時,這很好用,但一旦解決方案被創建,它就完全停止工作。我究竟做錯了什麼?

(代碼擊穿) 我基本上是訪問一個名爲CTW.pdf 接下來,我們創建一個臨時複製該軟件填補和分層 在完成PDF,該軟件保存新副本到同一目錄與新的名字(我簡單地添加到文件名的日期和時間)

下面的代碼:

if (screenLock.Text == "") 
{ 

} 
else 
{ 
    string fileNameExisting = @"C:\Program Files (x86)\Compliance Pro 2\CTW.pdf"; 
    string fileNameNew = @"C:\Program Files (x86)\Compliance Pro 2" + " CTW.pdf" + DateTime.Now.ToString("M/d/yyyy") + DateTime.Now.ToString("hh:mm:ss"); 

    using (var existingFileStream = new FileStream(fileNameExisting, FileMode.Open)) 
    using (var newFileStream = new FileStream(fileNameNew, FileMode.Create)) 
    { 
     // https://www.codeproject.com/Tips/679606/Filling-PDF-Form-using-iText-PDF-Library 
     // Open existing PDF 
     var pdfReader = new PdfReader(existingFileStream); 
     // PdfStamper, which will create 
     var stamper = new PdfStamper(pdfReader, newFileStream); 
     var form = stamper.AcroFields; 
     var fieldKeys = form.Fields.Keys; 
     foreach (string fieldKey in fieldKeys) 
     { 
      form.SetField(fieldKey, ""); 
     } 
     stamper.AcroFields.SetField("OSJNonOSJ", "TFSN"); 
     stamper.AcroFields.SetField("Branch", "9DCF"); 
     stamper.AcroFields.SetField("User Name Last First", "Joe" + "Pearson"); 
     stamper.AcroFields.SetField("Tested by Last First", emailTo.Text); 
     stamper.AcroFields.SetField("Date Tested", DateTime.Now.ToString("M/d/yyyy")); 
     stamper.AcroFields.SetField("COMMENTS", notes.Text); 
     stamper.AcroFields.SetField("WDE-Yes", user.Text + "5"); 
    } 
} 

注:我很努力,以確保我的軟件不需要任何管理權限來完成它的功能,我真的想在這裏避免這種情況以及。

+0

我已經添加了圖片以供參考 –

+1

通常C:\驅動器確實需要管理員權限才能寫入。這可能是你爲什麼得到'AccessDenied'錯誤? – Sach

+0

是否有更清潔的解決方案?我只是想拉這個PDF,寫下來,並保存在某個地方(我不在乎我保存的位置,它甚至可以由用戶定義) –

回答

2

將文件直接放入C:\或者甚至試圖寫入,這是一個糟糕的選擇。幾乎所有Windows驅動器的相關文件夾都受到保護,因此您至少需要Adminsitrative Privileges才能寫入它們。沒有這些,你甚至不能將程序目錄寫入權限(即使你可以這樣做,你也不應該把數據放在那裏)。

如果您想要一個可以編寫和存儲數據的地方,請參閱SpecialFolders。特別是用戶配置文件特定文件夾的設計使您能夠以普通用戶的身份進行訪問。如果數據在用戶之間共享,則使用Publics,否則使用Profile。

+1

然而,在'%ProgramFiles(x86)%'下的一個文件中讀取的實際錯誤呢? –

+0

有沒有最適合託管軟件目錄的位置?也許你有一個你已經成功的首選文件夾? –

+0

可能是你遇到了Virtualsiation(http://www.thecodeking.co.uk/2007/03/making-your-application-uac-aware.html)。真的什麼都是可能的,因爲你試圖首先訪問該文件夾。除了安裝程序,您甚至不應該嘗試。只需將該文件放入屬於該用戶的SpecialFolders中,您將有0次訪問問題。如果有任何問題,這是一個合理的管理問題。 – Christopher

1

錯誤的行是嘗試讀取現有文件的行。

由於您正在從受保護的位置讀取數據,但未指定您只想讀取數據,所以您正在收到指定的錯誤。它試圖鎖定需要提升特權的文件。

將讀取操作的行更改爲使用FileAccess.Read。它應該清除那個障礙。
當我創建本地控制檯應用程序並且不以管理員身份運行時,出現同樣的錯誤。但如果我添加下面的代碼,它工作正常。

using (var existingFileStream = new FileStream(fileNameExisting, FileMode.Open, FileAccess.Read)) 

然後,你將需要確定如何最好地寫入文件,不應在Program Files做到在所有的其他人提到的原因。

+0

雖然是個好地方,但我懷疑它會在下一行OP失敗,並嘗試打開第二個文件,意圖是** ** – MickyD

+0

我沒有在[文檔](https: //msdn.microsoft.com/en-us/library/47ek66wy)關於文件鎖定。但據說沒有'access'參數的構造函數默認爲'ReadWrite'訪問。這需要管理員登錄,除非安全描述符由應用程序的安裝程序另行設置。 – eryksun

相關問題