Windows 8中的StorageFile访问被拒绝异常

时间:2012-07-03 01:12:16

标签: c# windows-8 storagefile

我有一个metro风格的应用程序,它每隔X秒轮询一个存储在独立存储中的文件(这是对StorageFile对象的引用)。

它是一个PDF文件,在我的应用程序中,我允许用户打开文档并使用原生Reader应用程序对文档进行更改。

我的问题是,当我轮询文档时,我在OpenStreamForReadAsync上调用了StorageFile,但是如果您在用户保存对Reader中的文档所做的更改的精确时刻执行此操作应用程序,我得到一个Access denied异常被抛出。

我假设它是因为Windows正在写入文件,这很好,我只需要知道如何查询本地StorageFile引用以查看是否允许我打开它。 (理想情况下,不要在try catch中调用OpenStreamForReadAsync)。

2 个答案:

答案 0 :(得分:4)

Windows团队会告诉你做try / catch事情。当我要求File.Exists()API时,这就是他们告诉我的。

原因是:假设您要查找的API已存在...如果在您调用该API和尝试打开文件之间的毫秒数内打开/删除/重命名该文件会发生什么?繁荣!你回到原来的例外,需要尝试一下try / catch,以避免难以重现的崩溃。所以,既然你需要捕获这个异常,你也可以只是捕获异常。通过不提供File.Exists或您正在寻找的API,它们迫使我们捕获异常,以便用户不会遇到这些罕见的竞争条件错误。

答案 1 :(得分:0)

如果您不想使用Try Catch块,则必须手动跟踪您在任何给定时间更新的文件。在异步调用保存文件之前,请为文件添加唯一ID,例如其路径或其List集合路径的散列值。然后立即执行await save调用,将其从该列表中删除。

每当您轮询PDF时,请检查其UID是否在您的列表中。如果它在列表中,则推迟检查。继续推迟检查,直到它不在该列表中。

OR您也可以简单地创建模块级blnSaving布尔变量。保存之前,将其设置为true。完成保存后,将其设置为false。轮询PDF时,请检查该值是否设置为true。