繁体   English   中英

FileOpenPicker引发UnauthorizedAccessException

[英]FileOpenPicker throws UnauthorizedAccessException

我目前正在开发一个示例Windows 8 App,该应用程序将加载一个日志文件并对其进行处理,以便在DevExpress XtraGrid中显示。 当我将所需的扩展名添加到文件类型过滤器时,即使我将文件扩展名添加到appxmanifest,代码也会引发UnauthorizedAccessException:

private void OpenFile()
    {
        try
        {
            FileOpenPicker pickLog = new FileOpenPicker();
            pickLog.CommitButtonText = "Logdatei öffnen";
            pickLog.SuggestedStartLocation = PickerLocationId.ComputerFolder;
            pickLog.ViewMode = PickerViewMode.List;
            pickLog.FileTypeFilter.Add(".log"); //This is where the code jumps out
            pickLog.FileTypeFilter.Add(".slg");

            pickLog.PickSingleFileAsync().Completed += delegate
            {
                StorageFile logFile = pickLog.PickSingleFileAsync().GetResults();
                Stream strLog = logFile.OpenStreamForReadAsync().Result;

                vm.LoadCommand.Execute(strLog);
            };

            pickLog.PickSingleFileAsync();
        }
        catch (Exception ex) //Catches UnauthorizedAccessException
        {
            MessageDialog md = new MessageDialog(ex.Message, ex.GetType().ToString());
            md.ShowAsync();
        }
    }

更糟糕的是,如果我注释掉FileTypeFilter行,代码会跳到我在那儿添加的匿名方法:

private void OpenFile()
    {
        try
        {
            FileOpenPicker pickLog = new FileOpenPicker();
            pickLog.CommitButtonText = "Logdatei öffnen";
            pickLog.SuggestedStartLocation = PickerLocationId.ComputerFolder;
            pickLog.ViewMode = PickerViewMode.List;
            //pickLog.FileTypeFilter.Add(".log"); 
            //pickLog.FileTypeFilter.Add(".slg");

            pickLog.PickSingleFileAsync().Completed += delegate //This is where the code jumps out
            {
                StorageFile logFile = pickLog.PickSingleFileAsync().GetResults();
                Stream strLog = logFile.OpenStreamForReadAsync().Result;

                vm.LoadCommand.Execute(strLog);
            };

            pickLog.PickSingleFileAsync();
        }
        catch (Exception ex) //Catches COMException
        {
            MessageDialog md = new MessageDialog(ex.Message, ex.GetType().ToString());
            md.ShowAsync();
        }
    }

我连续几天进行了彻底的研究,却没有任何有效的结果(包括StackOverflow在内的资源),这就是为什么我在这里提出这个问题。 感谢您在此提供的帮助:)

更新:

引发COMException时,HRESULT始终为(0x80070005),但内部的HRESULT(在“详细信息”窗口中显示的HRESULT)通常为-21474xxxx,但是当我在VS中使用提升的权限调试我的应用程序时,内部的HRESULT为-2147024891 。

您似乎并没有await PickSingleFileAsync调用。

您应该做这样的事情:

StorageFile file = await picker.PickSingleFileAsync(); 

从Pick操作中获取StorageFile之后,可以对其执行所需的任何操作。


您必须停止执行,直到返回选择器的选择。 基本上,这是通过上面的行为您处理的。

此外,我看到MessageDialogShowAsync也是一个未等待的异步调用。 用法应为:

var messageDialog = new MessageDialog(...);
await messageDialog.ShowAsync();

或更短:

await new MessageDialog('','').ShowAsync();

Microsoft强制对任何被声明为异步的方法都使用Async后缀,以便更清楚地了解如何使用它。 我想您也应该使用它。

作为一种好的做法,如果要启动异步调用,则必须在某个时候等待它,否则您可能会得到无法预测的结果,在大多数情况下会导致应用程序崩溃。


另外,当您想以相同的类型显示两个消息对话框时,也会遇到这种类型的异常。 一次只能在屏幕上显示一个消息对话框,而第一个消息对话框已经显示,第二个对话框将尝试执行操作,该操作将引发UnauthorizedAccessException


编辑

这是更改代码的方法:

private async Task OpenFile()
{
    try
    {
        FileOpenPicker pickLog = new FileOpenPicker();
        pickLog.CommitButtonText = "Logdatei öffnen";
        pickLog.SuggestedStartLocation = PickerLocationId.ComputerFolder;
        pickLog.ViewMode = PickerViewMode.List;
        pickLog.FileTypeFilter.Add(".log"); //This is where the code jumps out
        pickLog.FileTypeFilter.Add(".slg");

        StorageFile logFile = await pickLog.PickSingleFileAsync();

        //operations on logFile are safe to be done here (open stream, loadCommand etc)
    }
    catch (Exception ex) //Catches UnauthorizedAccessException
    {
        MessageDialog md = new MessageDialog(ex.Message, ex.GetType().ToString());
        md.ShowAsync();
    }
}

您无需为Picker的Completed事件添加事件处理程序。 PickSingleFileAsync调用完成之后, PickSingleFileAsynclogFile上运行代码即可。 我无法提供完整的工作代码,因为我不知道您的逻辑。 但无论如何,请确保您还await OpenStreamForReadAsync调用( MSDN文档 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM