【问题标题】:How to copy image from windows file system to winrt(metro) c#/xaml如何将图像从 Windows 文件系统复制到 winrt(metro) c#/xaml
【发布时间】:2013-07-13 00:10:51
【问题描述】:

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

将新图像保存在旧图像之上:

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))"}

【问题讨论】:

  • 您如何获得originalPhotoImageStoragePath?它的价值是什么?您的应用可能无权访问它。

标签: windows-runtime microsoft-metro


【解决方案1】:

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

注意:

我也可能会花点时间谈谈 StorageFolder。中的一个 我得到的最常见的请求是迭代用户的文件和文件夹 系统。你真的不能——如果你的意思是从 c: 开始。尝试 遍历 c:\ 你会得到这个:[例外] 但是,你可以, 迭代库中的文件(文档、照片、音乐、视频和 甚至家庭组)文件夹 - 如果您在 清单。重要的是要注意返回的文件 文件夹将自动过滤为您在其中声明的文件类型 你的清单。 (我是否已经提到 . 不能声明?)让我说 重申作为开发人员,您有故意的限制,例如 这最终会改善用户的体验和安全性。

问候

【讨论】:

  • 嘿,谢谢你,我实际上已经读过了。但我刚刚发现了什么。是因为异步等待正在启动并且保存图像的过程已启动到任务,保存方法已被承诺完成作业,并且该过程被踢回UI过渡到新屏幕,on该新屏幕再次发出对图像的请求,以在列表中显示客户端数据。检索任务似乎已获得优先级,并且在保存任务有机会完成将新图像写入文件之前锁定旧图像以供显示。
  • 所以我正在做的是在内存中收集具有图像的对象。当页面启动 CRUD 操作时,页面将调用该 TYPE 的存储库,并且存储库将更新内存中的集合并写入文件。这将允许我让页面从内存集合中提取数据,而不是单个文件可能已更新或未更新,因为它们已被推送到后台进程/任务。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多