2012-07-03 121 views
3

我有一個metro風格的應用程序,每隔X秒輪詢存儲在獨立存儲中的文件(它是對StorageFile對象的引用)。StorageFile訪問被拒絕在Windows 8中的例外

它是一個PDF文件,在我的應用程序中,我允許用戶使用本地Reader應用程序打開文檔並更改文檔。

我的問題是,我呼籲StorageFileOpenStreamForReadAsync當我投票的文件,但如果你這樣做在精確的時刻,當用戶保存在閱讀器應用程序對文檔進行修改,我得到一個Access denied例外被拋出。

我假設它是因爲Windows正在寫入文件,這很好,我只需要知道如何查詢本地StorageFile引用以查看是否允許我打開它。 (最好不要叫OpenStreamForReadAsync包裹在try catch中)。

回答

4

Windows團隊會告訴你做try/catch的事情。這就是他們在詢問File.Exists()API時告訴我的。

推理是這樣的:假設您正在查找的API存在......如果在您調用該API和嘗試打開該文件之間的毫秒間隔內,該文件被打開/刪除/重命名?繁榮!你已經回到了原始的異常,並且需要做一個try/catch來避免難以重現的崩潰。所以,既然你需要趕上這個例外,那麼你不妨只是捕捉異常。通過不提供File.Exists或您正在查找的API,它們會強制我們捕獲異常,以便用戶不會遇到這些罕見的競爭條件錯誤。

+2

夠公平的,我已經實現了,但它只是感覺錯了:) – Mark

0

如果您不想使用Try Catch塊,那麼您必須手動跟蹤您在任何給定時間更新哪些文件。在保存文件的異步調用之前,爲文件添加一個唯一標識,例如其路徑或其路徑的散列值,以便將其添加到List集合中。然後立即在等待保存呼叫之後,將其從該列表中刪除。

任何時候你輪詢你的PDF,檢查它的UID是否在你的列表中。如果它在列表中,推遲檢查。保持推遲檢查,直到它不再在列表中。

或者您也可以簡單地創建一個模塊級blnSaving布爾變量。保存之前,將其設置爲true。完成保存後,將其設置爲false。當輪詢PDF時,推遲檢查該值是否設置爲true。