我知道我可以使用Win32 API来访问我自己的本地数据文件夹中的文件(例如,参见this answered question),但我需要访问我的应用程序之外的文件(例如,从图片库中),我正在尝试使用的库是所有这些都基于Win32文件 HANDLE
和/或它们依赖于使用相对文件名 .
由于获取图片库中文件的唯一方法(或获取从选择器返回的文件/文件夹)是通过 StorageFile
对象,如何重新使用我现有的代码?我是否必须将其重新编写为异步并依赖WinRT存储API?
我知道我可以使用Win32 API来访问我自己的本地数据文件夹中的文件(例如,参见this answered question),但我需要访问我的应用程序之外的文件(例如,从图片库中),我正在尝试使用的库是所有这些都基于Win32文件 HANDLE
和/或它们依赖于使用相对文件名 .
由于获取图片库中文件的唯一方法(或获取从选择器返回的文件/文件夹)是通过 StorageFile
对象,如何重新使用我现有的代码?我是否必须将其重新编写为异步并依赖WinRT存储API?
1 回答
从"Anniversary Update"(又名"RS1"或build 10.0.14393)开始,您可以从
StorageItem
(文件或文件夹)获取Win32HANDLE
并从StorageFolder
中创建新的命名文件(返回HANDLE
) . 您可以使用新的IStorageFolderHandleAccess和IStorageItemHandleAccess API执行此操作 .要使用这些新COM接口之一,您只需为接口确认
StorageFile
或StorageFolder
. 如果接口实际上不是由真实文件支持,而是伪文件 . 您可以使用C(C / CX或WRL)或C#中的这些接口 .这是一个简单的例子,使用
FolderPicker
让用户在他们的磁盘上选择一个位置(返回一个代理的StorageFolder
对象),然后使用Win32 APIReadFile
和WriteFile
从该位置读取和写入文件 .如上所述,我们必须将接口的声明复制到我们自己的代码中,因为真正的SDK版本位于错误的API分区中 . (我建议不要修改SDK文件来解决问题) . 首先是我们自己的头文件,例如
StorageHandleAccess.h
,它复制SDK文件WindowsStorageCOM.h
中的声明:接下来是API的简单用法 . 此示例采用
StorageFolder
,文件名和创建标志(打开或创建)并尝试打开(或创建)指定文件,从(到)文件读取(或写入)某些文本,并将一些输出写入调试控制台 .该代码在实际环境中不是特别有用,但说明了如何使用API . 这可以在空白C XAML项目中使用,以替换
MainPage.xaml.cpp
文件(您只需要更新命名空间):