我有一个 Metro 风格的应用程序,它每隔 X 秒轮询一次存储在独立存储中的文件(这是对 StorageFile
对象的引用)。
它是一个 PDF 文件,在我的应用程序中,我允许用户打开文档并使用 native 阅读器应用程序对文档进行更改。
我的问题是,当我轮询文档时,我在 StorageFile
上调用了 OpenStreamForReadAsync
,但是如果您在用户保存所做更改的精确时刻执行此操作到阅读器应用程序中的文档,我收到一个 Access denied
异常被抛出。
我假设这是因为 Windows 正在写入文件,这很好,我只需要知道如何查询本地 StorageFile
引用以查看是否允许我打开它. (理想情况下不调用包含在 try catch 中的 OpenStreamForReadAsync
)。
最佳答案
Windows 团队会告诉您执行 try/catch 操作。当我请求 File.Exists() API 时,他们就是这么告诉我的。
推理是这样的:假设您正在寻找的 API 存在......如果在您调用该 API 和您尝试打开文件之间的毫秒内,文件被打开/删除/重命名,会发生什么情况?繁荣!您回到了最初的异常,需要执行 try/catch 以避免难以重现的崩溃。因此,既然您无论如何都需要捕获此异常,那么您也可以只是捕获该异常。通过不提供 File.Exists 或您正在寻找的 API,它们迫使我们捕获异常,这样用户就不会遇到这些罕见的竞争条件错误。
关于c# - Windows 8 中的 StorageFile 访问被拒绝异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11303256/