C#FileSavePicker错误Metro App

时间:2014-01-28 17:12:59

标签: c# microsoft-metro windows-8.1

我正在编写一个应用程序(适用于C#中的Windows 8.1,Metro应用程序),该应用程序的资源中包含资源。我希望用户能够保存这些,所以我有一个按钮,让他们选择一个位置并保存文件。我使用了很多文件类型,其中包括一些(我没有完成添加文件类型,因为我给它进行了测试)。我收到以下错误:

An exception of type 'System.UnauthorizedAccessException' occurred in mscorlib.dll but was not handled in user code

其他信息:访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))

这是我的代码:

FileSavePicker saver = new FileSavePicker();
        saver.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
        saver.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt" });
        saver.FileTypeChoices.Add("PowerPoint Presentation", new List<string>() { ".ppt" });
        saver.FileTypeChoices.Add("Executable file", new List<string>() { ".exe" });
        saver.FileTypeChoices.Add("PDF", new List<string>() { ".pdf" });
        saver.DefaultFileExtension = ".docx";
        saver.SuggestedFileName = "New Document";
        StorageFile file = await saver.PickSaveFileAsync();
        if (null != file)
        {
            var filey = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(ViewUri.Text);
            await Windows.Storage.FileIO.WriteBytesAsync(filey, new byte[4000]);
            //Saved, tell the user
        }
        else
        {
            //Error, tell the user
        }

'ViewUri.Text'不应该是错误,因为它在代码的另一部分打开文件(ViewUri实际上显示文件的位置)。该应用程序崩溃在远离Windows ....线。我有以下问题,并希望得到任何帮助:

  1. WriteBytesAsync的第二个参数的正确用法是什么?新字节[4000]只是猜测。

  2. 是否可以保存具有大多数文件类型的文件(因此列出了每个支持的文件类型,并且它们必须选择正确的类型,并且它将保存)或者我是否必须检查它们是什么文件保存是,然后在不同的条件下保存?

  3. 导致错误的原因(如果不是字节[4000]部分)?

  4. 感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

我终于搞砸了! 因此,虽然它不涉及让用户保存文件,但它确实让他们选择将其复制到的位置。把它复制到那里。这是我的解决方案,以防其他人被这个难倒(我真的找不到这方面的任何信息):

FolderPicker picker = new FolderPicker();
        picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
        picker.FileTypeFilter.Add(".pdf");
        StorageFolder fold = await picker.PickSingleFolderAsync();

        StorageFile filey = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(ViewUri.Text);
        StorageFolder storageFolder = fold;
        try
        {
            await filey.CopyAsync(storageFolder);
            // let them know, done!
        }
        catch (System.UnauthorizedAccessException)
        {
            // an error occurred
        }

基本上,它会询问用户他们想要保存的位置。然后它将文件复制到该位置。将ViewUri.Text替换为文件的字符串位置,例如Assets \ mine.pdf

这也适用于所有(?)文件类型 - 至少据我所知。

感谢。