如何解决如何使用 C++ 读取 Hololens 上的文件
我正在尝试读取部署到 Hololens 的测试/调试 UWP 应用程序中的文件。我可以使用设备门户将文件放在设备上,但无法找到打开文件的正确路径。
我使用 MSFT BasicXrApp_uwp 示例作为基础,并包含具有 FindFileInAppFolder
函数的 FileUtility。这始终无法找到文件,并出现错误:
"The file should be embeded in app folder in debug build."
,
让我知道应用程序文件夹是:
C:\Data\Users\DefaultAccount\AppData\Local\DevelopmentFiles\364f83f4-6e13-42e4-8253-71dd3040951cVS.Debug_ARM.mikeh\
364f83f4-6e13-42e4-8253-71dd3040951cVS
部分在设备门户中可识别为 User Folders/LocalAppData 文件夹,但 Debug_ARM.mikeh 部分在门户上不可见。
如果可能,我正在使用 C++ 并尝试在静态的非 uwp 库中读取文件(指出这一点,所以我不会得到使用 UWP 异步内容的建议,如果可能的话)。
那么,如何将我的文件嵌入到应用程序文件夹中,或者如何放置文件以便我可以读取它?
解决方法
这是因为FindFileInAppFolder方法返回的文件夹路径是当前包的InstalledLocation,而你在设备入口查看的是LocalFolder/LocalCacheFolder,详细了解它们之间有什么不同,请参阅:File access permissions。
如何将我的文件嵌入到应用程序文件夹中,或者如何放置文件以便我可以读取它?
您可以通过 Device Portal 将您的文件放在 LocalState 文件夹中,并通过 ApplicationData.LocalFolder 属性获取此文件夹路径,路径应为:C:\Data\Users\DefaultAccount\AppData\Local\Packages\364f83f4-6e13-42e4-8253-71dd3040951c\LocalState
。对于如何通过 C++ 访问文件,您可以使用例如 File access sample
我在这里使用了答案,因为这里有比评论更多的空间。 我发现一些额外的东西很有用。我将 cppWinRT nuget 包添加到我的应用程序中。 我确实需要使用“异步内容”,例如:
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Storage;
StorageFolder storageFolder= KnownFolders::GetFolderForUserAsync(nullptr,KnownFolderId::PicturesLibrary).get();
这让我可以找到我上传到图片库的文件。但是将路径传递给我现有的库后,我无法打开它:
const auto sampleFile = storageFolder.GetFileAsync(fileName).get();
std::wstring path = sampleFile.Path();
MyLibraryCall(to_string(path));
MyLibraryCall
会尝试打开一个 ifstream,甚至使用 std::ifstream::in
也会失败。
所以我将文件复制到临时目录,在那里我可以打开它并处理它。
这很hacky,但它做了我需要的,这让我加载一个被 3D 部件查看器拒绝的 .obj 文件。
对所有文件名的循环是因为 storageFolder.GetFileAsync(fileName).get()
如果失败会抛出异常,对我来说我无法正确捕获。
StorageFolder tempFolder = Windows::Storage::ApplicationData::Current().TemporaryFolder();
std::wstring path;
auto files = tempFolder.GetFilesAsync().get();
for (auto file : files)
{
if (file.Name() == fileName) {
path = file.Path();
break;
}
}
if (!path.size()) {
// hasn't been copied into temp
StorageFile movedFile = sampleFile.CopyAsync(tempFolder).get();
path = movedFile.Path();
}
MyLibraryCall(to_string(path));
无论如何 - 不是最好的,但希望能帮助其他人寻找一种快速而肮脏的方式来处理 hololens/UWP 应用程序上的文件。
,请记住,您还必须授予应用程序访问该目录的权限。例如,如果您尝试访问 3D Objects 文件夹,则必须转到项目的 appxmanifest -> Capabilities -> 选中您希望您的应用能够访问的那个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。