Question

J'ai un peu de mal à comprendre quelle est la cause de cette erreur.J'ai ajouté des fonctionnalités FilePicker dans le manifeste, et ce n'est pas comme si j'essayais de faire quelque chose de fou;essayant simplement d'enregistrer dans un sous-dossier dans le dossier Documents ...

Erreur: "Une exception de type non gérée "System.UnauthorizedAccessException" s'est produit dans mscorlib.dll
Informations supplémentaires: l'accès est refusé.(Exception de HRESULT: 0x80070005 (E_ACCESSDENIED)) "

J'ai confirmé que mon compte utilisateur est administrateur et qu'il a un contrôle total sur les dossiers et fichiers.Mais je ne suis pas sûr de ce que je peux essayer d'autre.

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

Comment puis-je écrire dans un fichier créé par FileSavePicker?

Était-ce utile?

La solution

Vous n'avez pas besoin d'appeler StorageFolder.GetFolderFromPathAsync(savedItem.Path) et sFolder.GetFileAsync(savedItem.FileName).Vous devez supprimer ces deux lignes car elles lancent une exception. Vous devez utiliser l'objet StorageFile qui a été retourné par la méthode savePicker.PickSaveFileAsync(), car cet objet a toutes les autorisations.Ensuite, vous pouvez simplement appeler savedItem.OpenAsync(FileAccessMode.ReadWrite).

Autres conseils

Vous n'avez probablement pas activé "Accès à la bibliothèque de documents" dans la partie fonctionnalités du fichier appxmanifest de votre application.Sans cette fonctionnalité, Windows restreindra l'accès au système de fichiers.Il existe des capacités similaires pour les bibliothèques de musique, de vidéo et d'images.

Vous avez déjà ajouté "File Picker" à la partie des déclarations, ce qui n'est probablement pas ce que vous voulez.La déclaration "File Picker" indique que si une autre application appelle le sélecteur de fichiers, votre application sera répertoriée comme une source possible de fichiers.

J'ai également constaté que l'ajout de la capacité d'accès aux bibliothèques vidéo ou d'images dans Manifest ne prend effet qu'après le redémarrage de Windows 10. C'est peut-être un problème avec mon ordinateur, mais je pense que cela vaut la peine d'être partagé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top