UWP не может получить доступ к папке с жесткого диска через FolderPicker

Я хочу прочитать все файлы изображений из какой-либо папки на локальном жестком диске (включая подпапки) с помощью приложения UWP.

Я начинаю с FolderPicker, чтобы пользователь мог выбрать нужную папку:

public async static Task<string> GetFolderPathFromTheUser()
    {
        FolderPicker folderPicker = new FolderPicker();
        folderPicker.ViewMode = PickerViewMode.Thumbnail;
        folderPicker.FileTypeFilter.Add(".");
        var folder = await folderPicker.PickSingleFolderAsync();
        return folder.Path;
    }

после успешного получения пути к папке я пытаюсь получить доступ к папке:

 public async static Task<bool> IsContainImageFiles(string path)
    {
        StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(path);
        IReadOnlyList<StorageFile> temp= await folder.GetFilesAsync();
        foreach (StorageFile sf in temp)   
        {
            if (sf.ContentType == "jpg")
                return true;
        }
        return false;
    }

а затем я получаю следующее исключение:

Исключение типа «System.UnauthorizedAccessException» возникло в mscorlib.ni.dll, но не было обработано в информации WinRT кода пользователя: невозможно получить доступ к указанному файлу или папке (D: \ test). Элемент не находится в месте, к которому у приложения есть доступ (включая папки данных приложения, папки, доступные через возможности, и сохраненные элементы в списках StorageApplicationPermissions). Убедитесь, что файл не отмечен системными или скрытыми атрибутами файла.

Итак, как я могу получить доступ для чтения файлов из папки?

Спасибо.


person Community    schedule 12.06.2016    source источник
comment
Итак, вы проверяли, что файл не отмечен системными или скрытыми атрибутами файла? Вы проверили, что путь доступен с учетом уровня целостности и авторизации вашего приложения?   -  person IInspectable    schedule 12.06.2016
comment
Соответствующая информация: Разрешения на доступ к файлам.   -  person IInspectable    schedule 12.06.2016


Ответы (1)


Как только вы получите папку из средства выбора файлов, вы не сможете получить доступ к папке по ее пути. Вам нужно напрямую использовать возвращенный экземпляр StorageFolder:

public async static Task<IStorageFolder> GetFolderPathFromTheUser()
{
    FolderPicker folderPicker = new FolderPicker();
    folderPicker.ViewMode = PickerViewMode.Thumbnail;
    folderPicker.FileTypeFilter.Add(".");
    var folder = await folderPicker.PickSingleFolderAsync();
    return folder;
}

public async static Task<bool> IsContainImageFiles(IStorageFolder folder)
{
    IReadOnlyList<StorageFile> temp= await folder.GetFilesAsync();
    foreach (StorageFile sf in temp)   
    {
        if (sf.ContentType == "jpg")
            return true;
    }
    return false;
}

Если вы хотите получить к нему доступ позже, вам следует добавить его в будущий список доступа и сохраните возвращенный токен:

public async static Task<string> GetFolderPathFromTheUser()
{
    FolderPicker folderPicker = new FolderPicker();
    folderPicker.ViewMode = PickerViewMode.Thumbnail;
    folderPicker.FileTypeFilter.Add(".");
    var folder = await folderPicker.PickSingleFolderAsync();
    return FutureAccessList.Add(folder); 
}
public async static Task<bool> IsContainImageFiles(string accessToken)
{
    IStorageFolder folder = await FutureAccessList.GetFolderAsync(accessToken);
    IReadOnlyList<StorageFile> temp= await folder.GetFilesAsync();
    foreach (StorageFile sf in temp)   
    {
        if (sf.ContentType == "jpg")
            return true;
    }
    return false;
}
person Mehrzad Chehraz    schedule 12.06.2016