2

我的程序想要从用户可能已经拥有的客户端的 Windows 文件系统中复制一个文件,并替换现有的图像,该图像是应用程序中的缩略图/个人资料图像。

将新图像保存在旧的 Im 上,这样做:

async private void saveImage(string name, int clientId)
    {
        StorageFolder folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("ProfileImages", CreationCollisionOption.OpenIfExists);

        try
        {

            StorageFile newFileImage = await StorageFile.GetFileFromPathAsync(photoImageStoragePath);

            StorageFile originalFileImage = await StorageFile.GetFileFromPathAsync(originalPhotoImageStoragePath);
            await newFileImage.CopyAndReplaceAsync(originalFileImage);

        }
        catch (Exception ex)
        {                
            var name2 = string.Format("{0}_{1}{2}", name, GenerateId(), ".png");                
            copyImageAsync(folder, name2, clientId);
        }


    }

所以原始图像正在被新图像替换。我正在根据那里的路径为每个文件创建新的存储文件,我确保我以前使用的所有文件流都是 .disposed() 所以我有点迷失为什么我一直被拒绝访问。如果我使用 copyandreplace 并且如果我使用 moveandreplace,我会得到它。

确切的错误代码是 System.UnauthorizedAccess - {"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"}

4

2 回答 2

0

我认为答案在于保存后发生的事情,在 Windows 8 Metro 应用程序中,保存被启动,屏幕转换到另一个屏幕,再次列出了所有客户端:

因为 async/await 正在启动并且保存图像的过程已经启动到一个任务,save 方法已经被承诺完成工作并且这个过程被踢回到 UI 转换到一个新的屏幕,on该新屏幕再次发出对图像的请求,以在列表中显示客户端数据。检索任务看起来已获得优先级,并且在保存任务有机会完成将新图像写入文件之前锁定旧图像以供显示。

所以我正在做的是在内存中收集具有图像的对象。当页面启动 CRUD 操作时,页面将为该 TYPE 调用REPOSITORY,并且 repo 将更新内存中的集合并写入文件。这将允许我让页面从内存集合中提取它们的数据,而不是因为它们已被推到后台进程/任务而可能已更新或未更新的单个文件。

于 2013-07-12T16:10:51.543 回答
0

正如此链接所暗示的,可能是启用的一种功能选项。查看“Read Local files w/oa Picker”部分,它解释了如何启用 Documents Library Access。

意识到 :

我也可能会花点时间谈谈 StorageFolder。我得到的最常见的请求之一是迭代用户系统上的文件和文件夹。你真的不能——如果你的意思是从 c: 开始。尝试遍历 c:\ 并得到以下信息: [例外] 但是,如果您在显现。请务必注意,为文件夹返回的文件将自动过滤为您在清单中声明的​​文件类型。(我是否已经提到.不能声明?)让我重申,作为开发人员,您有这样的故意限制,最终会改善用户的体验和安全性。

问候

于 2013-07-04T07:17:36.050 回答