UWP无法通过FolderPicker从硬盘驱动器访问文件夹

时间:2016-06-12 15:32:15

标签: c# win-universal-app uwp windows-10-universal file-access

我想使用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;
    }

然后我得到了下一个例外:

  

类型&#39; System.UnauthorizedAccessException&#39;的例外情况发生在mscorlib.ni.dll但未在用户代码中处理   WinRT信息:无法访问指定的文件或文件夹(D:\ test)。该项目不在应用程序可以访问的位置(包括应用程序数据文件夹,可通过功能访问的文件夹以及StorageApplicationPermissions列表中的持久项目)。验证文件未标记系统或隐藏文件属性。

那么如何才能获取从文件夹中读取文件的权限?

感谢。

1 个答案:

答案 0 :(得分:4)

从文件选择器中获取文件夹后,您可能无法通过其路径访问该文件夹。您需要直接使用返回的StorageFolder实例:

<UserControl.Style>
    <Style TargetType="UserControl">
        <Style.Triggers>
            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=keyPressPlaceHoler}" />
                </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Style>

如果您想稍后访问它,则应将其添加到future access list并保留返回的令牌:

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;
}