UWP FolderPicker предоставляет доступ ко всем подпутям - PullRequest
0 голосов
/ 30 октября 2019

Я использую FolderPicker в своем универсальном приложении Windows, чтобы пользователь выбирал каталог, и когда он это сделал, мне нужно получить доступ к нескольким различным файлам в известных подпутях ниже этого каталога. Я могу выбрать каталог отлично, но когда я пытаюсь получить доступ к вещам в подпути оттуда, мне все еще отказывают в доступе. Есть ли способ предоставить доступ к нескольким файлам в родительском каталоге, не заставляя пользователя вручную выбирать каждый файл, к которому требуется доступ?

Вот мой код, который открывает средство выбора папок и добавляет выбранныекаталог к ​​моему будущему списку доступа:

var folderPicker = new Windows.Storage.Pickers.FolderPicker();
folderPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop;
folderPicker.FileTypeFilter.Add("*");

Windows.Storage.StorageFolder folder = await folderPicker.PickSingleFolderAsync();
if (folder != null) {
       StorageApplicationPermissions.FutureAccessList.AddOrReplace("GitDirectory", folder);
       PathTextBox.Text = folder.Path;
       this.IsPrimaryButtonEnabled = true;
}

(извиняюсь за мои соглашения об именах, я новичок в мире Win / C #, поэтому я пишу нехитроумно, как я знаю)

Вот код в другом классе, который пытается получить доступ к подпутьу. Можно предположить, что переменной GitDirectory ранее был присвоен результат вызова FutureAccessList.GetFolderAsync("GitDirectory");, поскольку она имеет:

StorageFile iniFile = await GitDirectory.GetFileAsync(@"datafiles\i18n\en_US.ini");
IniData data = iniParser.ReadFile(iniFile.Path);

Именно эта последняя строка в конечном итоге выдает это исключение: Access to the path 'E:\Documents\git\asirra\datafiles\i18n\en_US.ini' is denied.

Спасибо за любую помощь заранее

1 Ответ

4 голосов
/ 30 октября 2019

Проблема здесь в том, что когда у вас есть доступ к файлу через экземпляр StorageFile в произвольном месте (выбранном пользователем), вам нужно использовать этот конкретный экземпляр для работы с файлом. Вы не можете получить доступ к файлу напрямую, указав его путь (file.Path).

Я проверил исходный код IniParser на GitHub и обнаружил, что вы можете использовать IniDataParser API вместо этого, например, следующий метод:

IniData Parse(StringReader stringReader)

Вы можете прочитать файл ini, а затем передать его анализатору:

var iniFile = await GitDirectory.GetFileAsync(@"datafiles\i18n\en_US.ini");
var text = await FileIO.ReadAllTextAsync(iniFile);
var parser = new IniDataParser();
var data = parser.Parse(text);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...