Запись в файл с помощью FileSavePicker

Мне сложно понять, в чем причина этой ошибки. Я добавил FilePicker возможности в манифест, и это не похоже на то, что я пытаюсь сделать что-нибудь безумное; просто пытаюсь сохранить в подпапку в папке «Документы» ...

Ошибка: «Необработанное исключение типа 'System.UnauthorizedAccessException' произошло в mscorlib.dll
Дополнительная информация: Доступ запрещен. (Исключение из 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?


person Jason    schedule 06.12.2011    source источник
comment
На какой строке происходит исключение? Также: Environment.SpecialFolder.MyDocuments.   -  person JohnB    schedule 06.12.2011
comment
У приложений Metro нет прямого доступа к файловой системе, верно? Узнайте, в какой строке возникает исключение.   -  person Judah Gabriel Himango    schedule 07.12.2011


Ответы (3)


Вам не нужно звонить StorageFolder.GetFolderFromPathAsync(savedItem.Path) и sFolder.GetFileAsync(savedItem.FileName). Вы должны удалить эти две строки, потому что они вызывают исключение. Вы должны использовать объект StorageFile, который был возвращен методом savePicker.PickSaveFileAsync(), потому что этот объект имеет все разрешения. Тогда вы можете просто позвонить savedItem.OpenAsync(FileAccessMode.ReadWrite).

person palota    schedule 16.12.2011

Вероятно, у вас не включен «Доступ к библиотеке документов» в части возможностей appxmanifest вашего приложения. Без этой возможности Windows ограничит доступ к файловой системе. Есть аналогичные возможности для музыкальных, видео и графических библиотек.

Вы уже добавили «Средство выбора файлов» в раздел объявлений, что, вероятно, не то, что вам нужно. Объявление «Средство выбора файлов» указывает, что если какое-либо другое приложение вызовет средство выбора файлов, ваше приложение будет указано как возможный источник файлов.

person Jon    schedule 07.12.2011

Я также обнаружил, что добавление возможности доступа к библиотекам видео или изображений в манифесте вступает в силу только после перезапуска Windows 10. Возможно, это проблема моего компьютера, но я думаю, что этим стоит поделиться.

person nudaca    schedule 07.01.2016