【问题标题】:How to read a file on Hololens with C++如何使用 C++ 读取 Hololens 上的文件
【发布时间】:2021-05-06 22:12:08
【问题描述】:

我正在尝试读取正在部署到 Hololens 的测试/调试 UWP 应用程序中的文件。我可以通过设备门户将文件放在设备上,但找不到打开文件的正确路径。

我使用 MSFT BasicXrApp_uwp 示例作为基础,并包含具有 FindFileInAppFolder 函数的 FileUtility。这始终无法找到该文件,并出现错误: "The file should be embeded in app folder in debug build.", 在让我知道 app 文件夹是:

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 异步内容的建议,如果可能的话)。

那么,如何将我的文件嵌入到 app 文件夹中,或者如何放置文件以便阅读?

【问题讨论】:

    标签: c++ uwp native hololens


    【解决方案1】:

    这是因为 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

    【讨论】:

    • 谢谢,这确实有帮助,因为我现在可以使用 winrt + UWP 找到该文件。但是,我将文件名传递给基于 STL 的库,并使用 std::istream 读取文件。我无法使用std::ifstream ifs(filename); 打开文件我应该能够做到吗?根据我的阅读,我应该能够将现有的静态库与 UWP 应用程序一起使用。
    【解决方案2】:

    我在这里使用答案,因为空间大于评论。 我发现一些额外的有用的东西。我在我的应用程序中添加了 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 应用程序上的文件。

    【讨论】:

      【解决方案3】:

      请记住,您还必须授予应用访问该目录的权限。例如,如果您尝试访问 3D Objects 文件夹,则必须转到项目的 appxmanifest -> Capabilities -> 选中您希望您的应用能够访问的那个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多