【问题标题】:Writing to a file using FileSavePicker使用 FileSavePicker 写入文件
【发布时间】:2011-12-06 17:20:33
【问题描述】:

我很难弄清楚这个错误的原因是什么。我在 Manifest 中添加了FilePicker 功能,这不像是我在尝试做任何疯狂的事情;只是试图保存到 Documents 文件夹中的子文件夹...

错误:“类型未处理的异常 mscorlib.dll 中发生“System.UnauthorizedAccessException”
附加信息:访问被拒绝。 (HRESULT 的例外情况: 0x80070005 (E_ACCESSDENIED))"

我已确认我的用户帐户是管理员并且它对文件夹和文件具有完全控制权。但我不确定我还能尝试什么。

public void NewBTN_Click(object sender, RoutedEventArgs e)
{

    var mbox = new MessageDialog("Would you like to save changes before creating a new Note?", "Note+ Confirmation");

    UICommand YesBTN = new UICommand("Yes", new UICommandInvokedHandler(OnYesBTN));
    UICommand NoBTN = new UICommand("No", new UICommandInvokedHandler(OnNoBTN));

    mbox.Commands.Add(YesBTN);
    mbox.Commands.Add(NoBTN);

    mbox.DefaultCommandIndex = 1;
    mbox.ShowAsync().Start();
}

async void OnYesBTN(object command)
{
    this.Dispatcher.Invoke(Windows.UI.Core.CoreDispatcherPriority.Normal, (s, a) =>
        {
            // User clicked yes. Show File picker.
            HasPickedFile = true;

        }, this, null);

    if (HasPickedFile)
    {
        FileSavePicker savePicker = new FileSavePicker();
        savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
        // Dropdown of file types the user can save the file as
        savePicker.FileTypeChoices.Add("Cascading Stylesheet", new List<string>() { ".css" });
        savePicker.FileTypeChoices.Add("Hypertext Markup Language", new List<string>() { ".html" });
        savePicker.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt" });
        // Default extension if the user does not select a choice explicitly from the dropdown
        savePicker.DefaultFileExtension = ".txt";
        // Default file name if the user does not type one in or select a file to replace
        savePicker.SuggestedFileName = "New Note";
        StorageFile savedItem = await savePicker.PickSaveFileAsync();

        if (null != savedItem)
        {
            // Application now has read/write access to the saved file
            StorageFolder sFolder = await StorageFolder.GetFolderFromPathAsync(savedItem.Path);

            try
            {
                StorageFile sFile = await sFolder.GetFileAsync(savedItem.FileName);
                IRandomAccessStream writeStream = await sFile.OpenAsync(FileAccessMode.ReadWrite);

                IOutputStream oStream = writeStream.GetOutputStreamAt(0);
                DataWriter dWriter = new DataWriter(oStream);
                dWriter.WriteString(Note.Text);

                await dWriter.StoreAsync();
                oStream.FlushAsync().Start();

                // Should've successfully written to the file that Windows FileSavePicker had created.
            }
            catch
            {
                var mbox = new MessageDialog("This file does not exist.", "Note+ Confirmation");

                UICommand OkBTN = new UICommand("Ok", new UICommandInvokedHandler(OnOkBTN));

                mbox.Commands.Add(OkBTN);

                mbox.DefaultCommandIndex = 1;
                mbox.ShowAsync().Start();
            }
        }
    }
}

public void OnOkBTN(object command)
{
    this.Dispatcher.Invoke(Windows.UI.Core.CoreDispatcherPriority.Normal, (s, a) =>
        {
            // Do something here.
        }, this, null);
}
public void OnNoBTN(object command)
{
    this.Dispatcher.Invoke(Windows.UI.Core.CoreDispatcherPriority.Normal, (s, a) =>
        {
            // Don't save changes. Just create a new blank Note.
            Note.Text = String.Empty;
        }, this, null);
}

如何写入由 FileSavePicker 创建的文件?

【问题讨论】:

  • 异常发生在哪一行?另外:Environment.SpecialFolder.MyDocuments.
  • Metro 应用程序不能直接访问文件系统,对吧?找出异常发生在哪一行。

标签: c# .net windows-runtime microsoft-metro .net-4.5


【解决方案1】:

您无需致电StorageFolder.GetFolderFromPathAsync(savedItem.Path)sFolder.GetFileAsync(savedItem.FileName)。您必须删除这两行,因为它们会引发异常。 您应该使用方法 savePicker.PickSaveFileAsync() 返回的 StorageFile 对象,因为该对象具有所有权限。然后你可以直接拨打savedItem.OpenAsync(FileAccessMode.ReadWrite)

【讨论】:

    【解决方案2】:

    您可能没有在应用的 appxmanifest 的功能部分中启用“文档库访问”。如果没有此功能,Windows 将限制对文件系统的访问。音乐、视频和图片库也有类似的功能。

    您已经在声明部分添加了“文件选择器”,这可能不是您想要的。 “文件选择器”声明表明,如果其他应用程序调用文件选择器,您的应用程序将被列为可能的文件源。

    【讨论】:

      【解决方案3】:

      我还发现,在 Manifest 中添加视频或图片库访问功能只有在重新启动 Windows 10 后才会生效。 也许是我电脑的问题,但我认为值得分享。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-12
        • 1970-01-01
        • 1970-01-01
        • 2019-03-25
        • 2012-06-07
        • 2021-05-29
        • 2011-05-20
        • 2013-01-04
        相关资源
        最近更新 更多