【问题标题】:C# FileSavePicker Error Metro AppC# FileSavePicker 错误 Metro App
【发布时间】:2014-01-29 03:57:41
【问题描述】:

我正在编写一个应用程序(适用于 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 的第二个参数的正确用法是什么? new byte[4000] 只是一个猜测。

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

  3. 是什么导致了错误(如果不是 byte[4000] 部分)?

感谢任何帮助。谢谢!

【问题讨论】:

    标签: c# microsoft-metro windows-8.1


    【解决方案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

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

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      相关资源
      最近更新 更多