1

FileOpenPicker を使用して OneDrive からファイルを選択しています。このファイルは、後で "標準" C++ インターフェイス (C++/WinRT ではありません) を介してアクセスします。FileOpenPicker によって返されるパスにこれらのインターフェイスからアクセスできないことはわかっているので、StorageFile::CopyAsync を使用して、ApplicationData の下のアクセス可能な場所にファイルをコピーしています。

これは、デスクトップ上の UWP x64 ビルドでは機能しますが、HoloLens 2 上の UWP arm64 ビルドでは失敗します。

HoloLens では、FileOpenPicker はファイルのごく一部しか提供していません。たとえば、OneDrive 上の 2.83 MB のファイルから、FileOpenPicker と CopyAsync はわずか 144.6 KB のファイルを生成しています。FileOpenPicker によって提供されるソース ファイルと CopyAsync の宛先ファイルの両方について、ファイル サイズと完全性をテストしました。

uint64_t sourceSize = sourceFile.GetBasicPropertiesAsync().get().Size();
bool sourceIncomplete
    = uint32_t (sourceFile.Attributes())
    & uint32_t (FileAttributes::LocallyIncomplete);

サイズが 2.83 MB のうちわずか 144.6 KB であっても、LocallyIncomplete ビットはクリアされています。

その後、CopyAsync は指定された 144.6 KB を正常にコピーしますが、FileOpenPicker からのソース ファイルが不完全で無効であるため、後で失敗します。

HoloLens 2 に欠けているものは何ですか?


これは、最小限の再現可能な例です。https: //github.com/microsoft/Windows-universal-samples/tree/master/Samples/FilePicker/cppwinrt の Microsoft GitHub FilePicker サンプルから Scenario1_SingleFile.cpp を少し変更したものです。

UWP-arm64 用にコンパイルし、HoloLens 2 に展開し、OneDrive で数メガバイトのファイルをテストします。


// Modified version of Scenario1_SingleFile.cpp
//*********************************************************
//
// Copyright (c) Microsoft. All rights reserved.
// This code is licensed under the MIT License (MIT).
// THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
// IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
// PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
//
//*********************************************************

#include "pch.h"
#include "Scenario1_SingleFile.h"
#include "Scenario1_SingleFile.g.cpp"

#include <winrt/Windows.Storage.FileProperties.h>
#include <sstream>

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Storage;
using namespace Windows::Storage::Pickers;
using namespace Windows::UI::Xaml;

namespace winrt::SDKTemplate::implementation
{
    Scenario1_SingleFile::Scenario1_SingleFile()
    {
        InitializeComponent();
    }

    fire_and_forget Scenario1_SingleFile::PickAFileButton_Click(IInspectable const&, RoutedEventArgs const&)
    {
        auto lifetime = get_strong();

        // Clear previous returned file name, if it exists, between iterations of this scenario
        OutputTextBlock().Text(L"");

        FileOpenPicker openPicker;
        openPicker.ViewMode(PickerViewMode::Thumbnail);
        openPicker.SuggestedStartLocation(PickerLocationId::PicturesLibrary);
        openPicker.FileTypeFilter().ReplaceAll({ L".jpg", L".jpeg", L".png",
            // twhall@umich.edu added for "big" files:
            L".mp4", L".wmv", L".stl" });
        StorageFile file = co_await openPicker.PickSingleFileAsync();
        if (file != nullptr)
        {
            // Application now has read/write access to the picked file
#if 0
            OutputTextBlock().Text(L"Picked photo: " + file.Name());
#else
            // twhall@umich.edu:
            // *  Add feedback for file size and incompleteness.
            // *  Test on multi-megabyte files picked from OneDrive
            //    on the HoloLens (UWP-arm64)
            auto props = co_await file.GetBasicPropertiesAsync();
            uint64_t size = props.Size();
            uint32_t incomplete = (
                uint32_t (file.Attributes()) &
                uint32_t (FileAttributes::LocallyIncomplete));
            std::wstringstream text{};
            text << L"Picked file: "  << file.Name().c_str()
                 << L" (" << size << L" bytes, "
                 << (incomplete ? L"incomplete)" : L"complete)");
            OutputTextBlock().Text(text.str().c_str());
#endif
        }
        else
        {
            OutputTextBlock().Text(L"Operation cancelled.");
        }
    }
}
4

0 に答える 0