Domanda

Ho un po 'di difficoltà a capire qual è la causa di questo errore. ho aggiunto FilePicker capacità nel manifesto e non è come se stessi cercando di fare qualcosa di pazzo; Sto solo cercando di salvare in una cartella secondaria all'interno della cartella dei documenti ...

Errore: "Un'eccezione non gestita del tipo" System.UNauthorizedAccessException "si è verificata in mScorlib.dll
Ulteriori informazioni: l'accesso è negata. (Eccezione da HResult: 0x80070005 (e_accessdenied)) "

Ho confermato che il mio account utente è amministratore e che ha il pieno controllo su cartelle e file. Ma non sono sicuro di cos'altro posso provare.

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);
}

Come posso scrivere su un file creato da FileSavePicker?

È stato utile?

Soluzione

Non hai bisogno di chiamare StorageFolder.GetFolderFromPathAsync(savedItem.Path) e sFolder.GetFileAsync(savedItem.FileName). È necessario rimuovere queste due righe perché lanciano un'eccezione. È necessario utilizzare l'oggetto archiviazione che è stato restituito con il metodo savePicker.PickSaveFileAsync(), perché quell'oggetto ha tutte le autorizzazioni. Allora puoi semplicemente chiamare savedItem.OpenAsync(FileAccessMode.ReadWrite).

Altri suggerimenti

Probabilmente non hai "accesso alla libreria di documenti" abilitato nella parte delle capacità di AppXManifest della tua app. Senza questa capacità, Windows limiterà l'accesso al file system. Esistono funzionalità simili per le librerie di musica, video e immagini.

Hai già aggiunto "Picchiatore di file" alla parte delle dichiarazioni, che probabilmente non è quello che vuoi. La dichiarazione "File Picker" indica che se qualche altra applicazione invoca il selettore di file, l'app verrà elencata come possibile fonte di file.

Ho anche scoperto che l'aggiunta di video o librerie di immagini di accesso in manifest ha effetto solo dopo il riavvio di Windows 10. Forse è un problema con il mio computer, ma penso che valga la pena condividere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top