Я не могу заставить C ++ работать с вызовом ms-appdata: /// roaming / для получения файлов
В настоящее время я использую cpp для написания китайского редактора метода ввода, и он упакован как dll.
Поэтому, когда я звоню ifstream, чтобы прочитать мой файл настроек, права доступа к файлу ограничиваются тем, какое приложение активно, например, для универсальной программы Windows, которая помещается в «песочницу» в свои собственные папки в AppData и не может даже читать другие файлы. Тем более напиши им. Моя текущая проблема — найти файлы (в частности, файл настроек) в этой песочнице.
Например, эта строка:
WCHAR* FileName2 = L"C:/Users/Dog/AppData/Local/Packages/Facebook.317180B0BB486_8xx8rvfyw5nnt/RoamingState/Settings.txt";
отлично работает с
std::ifstream settingsFile;
settingsFile.open(FileName2, std::ios::in ); //this reading is successful for hard-coded path
settingsFile.get(myChar);
settingsFile.close();
когда мессенджер facebook является активной программой, но эта строка не:
WCHAR* FileName2 = L"ms-appdata:///roaming/Settings.txt";
Хотя я не могу жестко указать путь для каждого каталога UserProfile и UWP.
Кто-нибудь знает, что я могу делать не так? Я использую Visual Studio 2015 Community в Windows 10 и у меня есть универсальный файл настроек для EXE-файлов x86 и x64, и я планирую написать службу для копирования этого файла настроек в папку RoamingState каждого UWP при каждом изменении этого файла.
Используйте свойство Windows :: Storage :: ApplicationData :: RoamingFolder :: Path, чтобы получить полный путь к перемещаемой папке:
https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefolder.path.aspx
ms-appdata: // работает только с файловыми API WinRT.
Вот как получить доступ к этому API из стандартного C ++:
#include <cstdint>
#include <string>
#include <windows.storage.h>
#include <wrl.h>
using namespace ABI::Windows::Storage;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;
std::wstring GetRoamingFolderPath()
{
ComPtr<IApplicationDataStatics> appDataStatics;
auto hr = RoGetActivationFactory(HStringReference(L"Windows.Storage.ApplicationData").Get(), __uuidof(appDataStatics), &appDataStatics);
if (FAILED(hr)) throw std::runtime_error("Failed to retrieve application data statics");
ComPtr<IApplicationData> appData;
hr = appDataStatics->get_Current(&appData);
if (FAILED(hr)) throw std::runtime_error("Failed to retrieve current application data");
ComPtr<IStorageFolder> roamingFolder;
hr = appData->get_RoamingFolder(&roamingFolder);
if (FAILED(hr)) throw std::runtime_error("Failed to retrieve roaming folder");
ComPtr<IStorageItem> folderItem;
hr = roamingFolder.As(&folderItem);
if (FAILED(hr)) throw std::runtime_error("Failed to cast roaming folder to IStorageItem");
HString roamingPathHString;
hr = folderItem->get_Path(roamingPathHString.GetAddressOf());
if (FAILED(hr)) throw std::runtime_error("Failed to retrieve roaming folder path");
uint32_t pathLength;
auto roamingPathCStr = roamingPathHString.GetRawBuffer(&pathLength);
return std::wstring(roamingPathCStr, pathLength);
}
Других решений пока нет …