2013-07-28 54 views
8

我試圖讓我的圖像查看器應用程序與通過單擊直接在Zip文件夾內的圖像文件(使用Windows資源管理器瀏覽Zip文件)打開的文件一起工作。該應用程序似乎與正確的命令行中運行,它看起來像這樣:UnauthorizedAccessException從Zip文件的臨時文件夾中的文件路徑

"C:\myApp.exe" "C:\Users\Admin\AppData\Local\Temp\Temp1_Wallpapers.zip\Wallpaper1.jpg" 

文件正在讀下面的代碼:

using (var fs = new FileStream(path, FileMode.Open)) 

和異常是在該行拋出:

例外:拋出:「訪問路徑'C:\ Users \ Admin \ AppData \ Local \ Temp \ Temp1_Wallpapers.zip \ Wallpaper1.jpg'被拒絕。」 (System.UnauthorizedAccessException)

System.UnauthorizedAccessException被拋出:「訪問路徑'C:\ Users \ Admin \ AppData \ Local \ Temp \ Temp1_Wallpapers.zip \ Wallpaper1.jpg'被拒絕。」

我想這可能是一個問題,如何解釋路徑。中間有一個.zip,所以這可能是問題,但我不知道如何解決這個問題。

此外,直接在該路徑上直接打開文件(而不是通過壓縮文件夾瀏覽器窗口)會導致相同的異常。

回答

2

我剛剛發現問題是什麼。從壓縮文件夾提取到臨時文件夾的文件將具有read-only屬性,我的圖像查看器應用程序顯然無法處理並拋出UnauthorizedAccessException。我只需要刪除該屬性,一切都會好的。試圖讀取只讀文件是一種訪問衝突的種類。

+2

不,讀取只讀文件不是未經授權的,但您用來讀取它們的代碼是要求過多(讀/寫)權限。修復並且錯誤消失。 – EricLaw

+0

@EricLaw有關如何做到這一點的任何提示? – user1306322

+2

嘗試向FileStream構造函數添加第三個參數:FileAccess.Read。這實在是愚蠢的.Net默認情況下是最具限制性的('ReadWrite')權限,但我猜想,否則論壇將充滿「爲什麼我不能寫入我的文件流!?!?!」 – nemec

5

Windows資源管理器可以通過shell名稱擴展處理程序將.zip歸檔文件視爲文件夾。這樣的處理程序可以擴展shell的功能。但是,這僅限於shell函數,它不會自動使低級文件訪問功能能夠執行相同的操作。像FileStream一樣。

您需要首先將該文件從.zip壓縮文件中複製出來,然後才能使用FileStream將其打開。大量的.zip支持庫,SharpZipLib和DotNetZip都很受歡迎。它最終被添加到.NET 4.5與System.IO.Compression.ZipArchive類。讓我們挑選一個最適合未來的示例代碼。

我創建了一個帶有單個圖像的Example.zip存檔並將其複製到了我的臨時目錄。此代碼檢索它,並使它一個WinForms形式的背景圖像:

using System.IO; 
using System.IO.Compression; // Add reference to System.IO.Compression 
... 

    private void button1_Click(object sender, EventArgs e) { 
     var srcePath = @"c:\users\hpass_000\appdata\local\temp\example.zip"; 
     using (var file = new FileStream(srcePath, FileMode.Open)) { 
      var zip = new ZipArchive(file, ZipArchiveMode.Read); 
      var entry = zip.GetEntry("Chrysanthemum.jpg"); 
      var destPath = Path.GetTempFileName(); 
      using (var srce = entry.Open()) 
      using (var dest = new FileStream(destPath, FileMode.Create)) { 
       srce.CopyTo(dest); 
      } 
      using (var img = Image.FromFile(destPath)) { 
       this.BackgroundImage = new Bitmap(img); 
      } 
      File.Delete(destPath); 
     } 
    } 
+0

看來,完整的路徑是包含在一個普通的文件夾,它只是被稱爲「.zip」,但它不是一個zip文件夾。通常,壓縮文件夾的內容路徑在完整路徑欄中不顯示「.zip」,所以情況並非如此。這就是爲什麼我想知道爲什麼它不起作用。 – user1306322

+2

它不起作用是完全正常的,這是我試圖在答案中提出的觀點。聽起來像你完全錯過了它。不確定如何在這個駝峯上幫助你,我建議你做我推薦的東西。 –

+0

與使用Windows資源管理器瀏覽壓縮文件夾相比,此臨時文件夾在完整路徑中具有單詞「temp」2次,看起來像普通文件夾。我不知道我還能表達什麼,我幾乎可以肯定,這不是你的想法。 – user1306322

1

問題無關與.在臨時文件路徑,因爲時間在文件名以及目錄名是合法的。

正如你所期望的那樣,在shell中打開一個Zip文件夾並打開一個文件會自動將內容提取到一個臨時文件夾,這只是一個普通的文件夾。唯一在這裏看起來很奇怪的是,它打開了臨時文件夾Administrator。你是否以普通用戶身份運行該exe文件?如果exe和shell在單獨的用戶下運行,則exe可能無法訪問shell使用的臨時文件夾。