2010-10-18 50 views
2

我們的應用程序需要用戶從他們的照相機中選擇照片。我在添加此功能時測試過的相機在「我的電腦」中都顯示爲驅動器盤符,因此加載和使用該映像非常簡單。一位同事給我的照相機,而不是作爲驅動器安裝,它觸發了可怕的「掃描儀和照相機嚮導」。我很高興看到在「我的電腦」中有一個攝像頭條目,事實上我可以瀏覽並從標準OpenFileDialog中選擇文件。 - 太棒了!讀取從「掃描儀和照相機」打開的文件拋出UnauthorizedAccessException

除了當我嘗試訪問文件時,我收到「UnauthorizedAccessException」。經過調查,我發現它實際上是從這個位置加載文件: C:\ Documents and Settings \ sk \ Local Settings \ Temporary Internet Files \ Content.IE5 \ AXY0DNE3

什麼在這個世界上? IE5.5?

從這裏,事情繼續下去。該位置顯然是一個非常好的隱藏位置,我只能通過直接在瀏覽器欄中輸入路徑來導航。然後我想我可以將文件複製到一個臨時位置並從那裏使用它。所以我做到了,但我仍然無法使用該文件,拋出相同的異常: 訪問路徑'C:\ Documents and Settings \ sk \ Local Settings \ Temp \ IMG_0005 [1] .jpg'被拒絕。

看來權限設置與文件一起被複制(有意義)。

作爲解決方法,我已經指示我的用戶使用可怕的小嚮導,將文件複製到臨時位置,然後從那裏選擇它們。我不喜歡這個,但是我需要今天部署這個功能。有了解決方法,我現在想嘗試在可能的情況下繼續工作。理想情況下,我可以只使用該文件而不將其複製到其他位置等等。我不明白的是爲什麼UnauthorizedAccessException正在被拋出。

我希望有人在那裏面臨類似的挑戰,並可以分享如何使用這些文件的一些技巧。我寧願不走整個WIA路線,並通過相機界面處理文件。

回答

0

該文件是隻讀的。我應該檢查一下!

當然有很多方法可以解決這個問題。起初我以爲「我只是強制只讀屬性」,但後來我認爲「等等,我不應該這樣做,我畢竟只是閱讀文件」這麼長的故事,讓我看起來很深入我的IO庫,發現我並沒有明確設置FileAccess的念想我應該:

public static byte[] ReadWholeFileBytes(string filename) 
{ 
    Guard.ArgumentNotNullOrEmptyString(filename, "filename"); 

    if(!File.Exists(filename)) 
    { 
     throw new FileNotFoundException("Failed finding file " + filename); 
    } 

    using (Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read)) 
    { 
     return ReadWholeStream(stream); 
    } 
} 

但是製作這個答案完全爲別人,你可以刪除只讀用的代碼這一點點的緣故:

File.SetAttributes(openFile.FileName, FileAttributes.Normal);