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 に欠けているものは何ですか?
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.");
}
}
}