std::filesystem::directory_iterator в приложении C++/CX UWP не может найти каталог?

Я пишу кроссплатформенное приложение, поэтому подумал, что я сделаю пользовательский интерфейс в XAML с C++/CX соответственно. Какао и ядро ​​в стандарте C++. Однако у меня проблемы с доступом к документам.

Я представляю FolderPicker и взять путь и сунуть его в directory_iterator, но итератор каталога не находит никаких файлов, и если я позвоню exists() на пути, это говорит false,

Я гуглил все выше и ниже, но все, что есть в сети, говорит мне, что я должен просто иметь доступ к файлам, как только у меня будет StorageFolder, и ничто не относится к стандартным API C++17.

Что мне нужно сделать, чтобы предоставить стандартной библиотеке доступ к файлам?

Я поднимаю средство выбора файлов, используя:

FolderPicker    ^picker = ref new FolderPicker;
picker->FileTypeFilter->Append( "*" );
IAsyncOperation<StorageFolder ^> ^storageFolderOp = picker->PickSingleFolderAsync();
auto asyncTask = concurrency::create_task(storageFolderOp);
asyncTask.then([this](StorageFolder ^storageFolder)
               {
                   cout << "Picked directory: " << StdStringFromString(storageFolder->Path) << endl;
                   commandsPathField->Text = storageFolder->Path;
               });

Код, который принимает эту строку (как std::string) и пытается перечислить файлы в этом каталоге:

path    commandsFolderPath(inFolderPath);
if (exists(commandsFolderPath))
{
    directory_iterator    directoryIterator(commandsFolderPath);
    for ( ; directoryIterator != directory_iterator(); ++directoryIterator )
    {
        const directory_entry& currFile = *directoryIterator;
        if (currFile.path().filename().string().compare("data") == 0 || currFile.path().filename().string().find(".") == 0)
        {
            continue;
        }
        load_one_command_folder(currFile.path().string());
    }
}
else
{
    cout << "No directory " << commandsFolderPath.string() << endl;
}

И мой манифест:

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap mp rescap">

  <Identity
    Name="69b58249-31af-4bb3-95f4-fd339268a557"
    Publisher="CN=Uli"
    Version="1.0.0.0" />

  <mp:PhoneIdentity PhoneProductId="69b58249-31af-4bb3-95f4-fd339268a557" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>

  <Properties>
<DisplayName>VanguardBotGUI</DisplayName>
<PublisherDisplayName>Uli Kusterer</PublisherDisplayName>
<Logo>Assets\StoreLogo.png</Logo>
  </Properties>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
  </Dependencies>
  <Resources>
    <Resource Language="x-generate" />
  </Resources>
  <Applications>
    <Application Id="App"
      Executable="$targetnametoken$.exe"
      EntryPoint="vanguardbot_win.App">
      <uap:VisualElements
        DisplayName="vanguardbot_win"
        Square150x150Logo="Assets\Square150x150Logo.png"
        Square44x44Logo="Assets\Square44x44Logo.png"
        Description="vanguardbot_win"
        BackgroundColor="transparent">
        <uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png"/>
        <uap:SplashScreen Image="Assets\SplashScreen.png" />
      </uap:VisualElements>
    </Application>
  </Applications>
  <Capabilities>
    <Capability Name="internetClient" />
    <Capability Name="internetClientServer" />
    <rescap:Capability Name="appDiagnostics" />
  </Capabilities>
</Package>

Полный код находится по адресу https://github.com/uliwitness/vanguardbot на тот случай, если вы захотите запустить его и пройти через него (просто создайте имя пользователя / пароль для пользовательского интерфейса, ошибка до этого момента). Соответствующие файлы windows/MainPage.xaml.cpp (vanguardbot_win::MainPage::FolderPicker_Click), common/vanguardbot.cpp (vanguardbot::connect) а также vanguardbot/windows/Package.appxmanifest, Решение vanguardbot_win.sln на верхнем уровне.

1 ответ

Решение

К сожалению, папка вернулась из FolderPicker является "посредническим" местоположением, означающим, что весь доступ к нему происходит через внепроцессный компонент, который выполняет соответствующие проверки безопасности. API-интерфейсы хранилища WinRT знают, как обращаться с этими посредниками, но стандартные функции CRT / STL - нет (на данный момент). Библиотеки должны быть обновлены, чтобы вызывать более новые Win32 API-интерфейсы под прикрытием, чтобы правильно обрабатывать места размещения.

На данный момент вам придется использовать Windows.Storage API или напрямую использовать Win32 API, такие как FindFirstFileExFromApp это может обращаться с посредническими местоположениями.

Другие вопросы по тегам