none
[UWP] Datei in Download Ordner speichern und darin schreiben - Access denied RRS feed

  • Frage

  • Hallo,

    ich möchte aus meiner App eine Backup Datei erstellen. In dieser Datei sollen bestimmte Daten im .csv Format abgelegt werden (Über die CsvHelper Projekt Seite ).

    Laut Doku ( MSDN ) kann nur im Download Ordner ohne spezielle Rechte gelesen und geschrieben werden.

    Ich habe es auch schon geschafft, die Datei zu erstellen:

    var newFile = await DownloadsFolder.CreateFileAsync(filename);
    

    Allerdings möchte ich auch gleich in diese Datei herein schreiben mit:

    TextWriter txtwrite = File.CreateText(newFile.Path);
    CsvWriter csv = new CsvWriter(txtwrite);
    

    Allerdings bekomme ich beim TextWriter ein:

    Access to the path 'C:\Users\Paul\Downloads\***!App' is denied

    Wie kann ich eine Datei aus der App heraus erstellen und direkt rein schreiben? Die Datei soll aber frei zugänglich sein...

    Vielen Dank für eure Hilfe!


    Mittwoch, 4. Mai 2016 20:31

Antworten

  • Hi nochmal, ich habe deinen Code ausprobiert und bereits bei folgender Zeile tritt eine Exception auf:

    TextWriter txtwrite = File.CreateText(newFile.Path);


    Ich denke, dass diese Exception auch bei dir auftritt, aber aus irgendwelchen Gründen nicht bearbeitet wird. Beim nächsten Aufruf

    CsvWriter csv = new CsvWriter(txtwrite);

    würde die Datei dann ein zweites mal aufgerufen werden und wir wären wieder beim oben genannten Absatz "If you create a file or folder in the Downloads folder, we recommend that you add that item to your app's FutureAccessList so that your app can readily access that item in the future." :)

    Wenn ich (wie in der Exception gewünscht) jedoch folgenden Code erweitere

    Task.Run(() =>
    {
        TextWriter txtwrite = File.CreateText(newFile.Path);
        CsvWriter csv = new CsvWriter(txtwrite);
    });

    tritt keine Exception auf und dein Problem sollte gelöst sein. Hoffe ich konnte dir damit helfen ;)

    Viele Grüße
    Lars Krämer - Software Entwickler für Web und Microsoft-Technologien

    ---------------------------------------------------------------------------------

    lkraemer.de software solutions


    Donnerstag, 5. Mai 2016 18:42
  • Habe es jetzt über einen Umweg gelöst... Gehts auch besser?

                    var newFile2 = await DownloadsFolder.CreateFileAsync(tStamp + "_bblBackup.csv");
    
                    StorageFolder localFolder = ApplicationData.Current.LocalFolder;
    
                    var localFile = await localFolder.CreateFileAsync(tStamp + "_bblBackup.csv");
    
    
                    await Task.Run(() =>
                    {
                        
                        TextWriter txtwrite = File.CreateText(picked.Path);
    
                        CsvWriter csv = new CsvWriter(txtwrite);
                    });
    
    
                    await localFile.CopyAndReplaceAsync(newFile2);
    

    Donnerstag, 5. Mai 2016 19:03

Alle Antworten

  • Hi,

    ich bin mir nicht ganz sicher aber ich denke, dass jede App grundsätzliche eine Art von Berechtigung benötigt. Ansonsten könnte ja jede x-beliebige App alle Downloads des Benutzer durchforsten.

    Möglicherweise wäre auch folgender Absatz aus deinem Link Hilfreich:

    "If you create a file or folder in the Downloads folder, we recommend that you add that item to your app's FutureAccessList so that your app can readily access that item in the future."

    Vielleicht kann deine App deswegen danach nicht mehr drauf zugreifen.

    Ich werde gleich auch noch mal kurz dazu ein bisschen was ausprobieren ;)


    Viele Grüße Lars Krämer


    lkraemer.de software solutions

    Donnerstag, 5. Mai 2016 18:12
  • Hi nochmal, ich habe deinen Code ausprobiert und bereits bei folgender Zeile tritt eine Exception auf:

    TextWriter txtwrite = File.CreateText(newFile.Path);


    Ich denke, dass diese Exception auch bei dir auftritt, aber aus irgendwelchen Gründen nicht bearbeitet wird. Beim nächsten Aufruf

    CsvWriter csv = new CsvWriter(txtwrite);

    würde die Datei dann ein zweites mal aufgerufen werden und wir wären wieder beim oben genannten Absatz "If you create a file or folder in the Downloads folder, we recommend that you add that item to your app's FutureAccessList so that your app can readily access that item in the future." :)

    Wenn ich (wie in der Exception gewünscht) jedoch folgenden Code erweitere

    Task.Run(() =>
    {
        TextWriter txtwrite = File.CreateText(newFile.Path);
        CsvWriter csv = new CsvWriter(txtwrite);
    });

    tritt keine Exception auf und dein Problem sollte gelöst sein. Hoffe ich konnte dir damit helfen ;)

    Viele Grüße
    Lars Krämer - Software Entwickler für Web und Microsoft-Technologien

    ---------------------------------------------------------------------------------

    lkraemer.de software solutions


    Donnerstag, 5. Mai 2016 18:42
  • Habe es jetzt über einen Umweg gelöst... Gehts auch besser?

                    var newFile2 = await DownloadsFolder.CreateFileAsync(tStamp + "_bblBackup.csv");
    
                    StorageFolder localFolder = ApplicationData.Current.LocalFolder;
    
                    var localFile = await localFolder.CreateFileAsync(tStamp + "_bblBackup.csv");
    
    
                    await Task.Run(() =>
                    {
                        
                        TextWriter txtwrite = File.CreateText(picked.Path);
    
                        CsvWriter csv = new CsvWriter(txtwrite);
                    });
    
    
                    await localFile.CopyAndReplaceAsync(newFile2);
    

    Donnerstag, 5. Mai 2016 19:03