Der Zugriff auf den Pfad "" wurde verweigert

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Silvergreen.

    Der Zugriff auf den Pfad "" wurde verweigert

    Guten Abend allerseits,

    heute überkam mich mal wieder die Lust in mein altes Projekt zu schauen und es endlich fertig zu stellen.
    Allerdings gibt es da dann noch das oben angesprochene Problem.
    Ich versuche auf User.Directory eine Datei zu speichern nur funktioniert dies nicht so wie ich es gerne hätte.
    Hier mal der Code:

    VB.NET-Quellcode

    1. Sub saveXML()
    2. Try
    3. If System.IO.Directory.Exists(documents) Then
    4. If System.IO.File.Exists(pfad) Then
    5. save(pfad)
    6. Else
    7. Dim abc As FileStream = File.Create(pfad) <-- Error genau hier
    8. abc.Close()
    9. abc.Dispose()
    10. abc = Nothing
    11. save(pfad)
    12. End If
    13. Else
    14. System.IO.Directory.CreateDirectory(documents)
    15. If System.IO.File.Exists(pfad) Then
    16. save(pfad)
    17. Else
    18. Dim abc As FileStream = File.Create(pfad)
    19. abc.Close()
    20. abc.Dispose()
    21. abc = Nothing
    22. save(pfad)
    23. End If
    24. End If
    25. Catch ex As Exception
    26. Dim msg As Integer = MessageBox.Show("Error: 7, bitte wende dich an den Support" & vbNewLine & "Soll die ErrorMessage angezeigt werden?", "Fehler!", MessageBoxButtons.YesNo)
    27. If msg = DialogResult.Yes Then
    28. MessageBox.Show(ex.ToString, "ErrorMessage")
    29. ElseIf msg = DialogResult.No Then
    30. End If
    31. End Try
    32. End Sub

    Administrator wird bereits verwendet!

    Mfg Silvergreen
    ?(
    Hab mal bissl aufgeräumt und die redundanzen raus geworfen. Trotzdem bitte den Post von @ErfinderDesRades beachten, weil deinen Fehler habe ich nicht korrigiert.

    VB.NET-Quellcode

    1. Dim documents As IO.DirectoryInfo("C:/tmp")
    2. Dim path as New IO.FileInfo("C:/tmp/meinedatei.xml")
    3. If(Not documents.Exists) Then documents.Create
    4. If(Not path.Exists) Then
    5. Dim abc As FileStream = File.Create(path.FullName)
    6. abc.close()
    7. abc.dispose()
    8. abc = nothing
    9. EndIf
    10. save(path.FullName)

    Code nicht getestet weil auf Handy aus Kopf geschrieben.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mrMo“ ()

    @Silvergreen Geht das im Explorer?
    Geht das, wenn das Programm im Admin-Mode läuft?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe deinen Fehler nicht gelöst.
    Aber ich habe eine wichtige Code verbesserung für dich.
    Schau dir mal, diesen Code an:

    VB.NET-Quellcode

    1. If MessageBox.Show("Error: 7, bitte wende dich an den Support" _
    2. & vbNewLine & "Soll die ErrorMessage angezeigt werden?" _
    3. , "Fehler!", MessageBoxButtons.YesNo) = DialogResult.Yes Then
    4. MessageBox.Show(ex.ToString, "ErrorMessage")
    5. End If
    Visual Basic.NET 8o
    MS-SQL
    8o
    Sicherlich nicht. Wenn schon nicht alle Exceptions durch intensives Testen bereits durch passendes Exception-Handling verarbeitet werden können, dann sollte sich der User bestimmt nicht mit irgendwelchen "detaillierten" Fehlermeldungstexten rumschlagen und diese ggf. noch an den Programmierer weitergeben müssen. Die komplette Ex gehört in z.B. eine Fehlerlogdatei, die an den Programmierer geschickt wird. Und wenn Programmierer = User, dann lässt man ungefiltertes Try-Catch gleich weg, denn ohne Sinn und Verstand eingebaut ist Try-Catch ein heißes Eisen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank erst mal für die zahlreichen Antworten.
    @ErfinderDesRades, wie ich genau meine Frage ändern soll weiß ich leider nicht (ja ich habe mir den Link durchgelesen). Trotz alledem habe ich jetzt eine PNG mit dem Errorcode angehangen. Natürlich ist meine Frage, warum der Fehler auftritt und wie ich diesen behebe. Da ich nicht der erfahrenste Programmierer bin und es bisher nur durch ein Praktikum ,,beigebracht" bekommen habe sind mir auch noch viele Begriffe unklar.

    mrMo schrieb:


    VB.NET-Quellcode

    1. Dim documents As IO.DirectoryInfo("C:/tmp") <---- Die Klammer funktioniert dort nicht "Arraygrenzen können nicht in Typspezifizierern verwendet werden"
    2. Dim path as New IO.FileInfo("C:/tmp/meinedatei.xml")
    3. If(Not[color=#008000] [/color]documents.Exists) Then documents.Create <--- Daher auch hier Error


    @mrMo leider funktioniert der Code an der markierten stelle nicht, aber ich verstehe, was Du mir damit sagen möchtest, und werde es auch ändern(vorausgesetzt der markierte Fehler wird behoben). "documents" sowie "path" hatte ich vorher beim laden der Form erstellt:

    VB.NET-Quellcode

    1. Dim documents As String = My.Computer.FileSystem.SpecialDirectories.MyDocuments + "\VolumeMixer"
    2. Dim pfad As String = documents + "\pID.xml"

    Inwiefern sich hier ein Fehler eingeschlichen hat, kann ich nicht sagen.

    @RodFromGermany Falls ich Deine Frage verfehle, bitte korrigieren. Manuell kann ich die Datei erstellen, dann tritt aber der nächste Fehler auf:

    VB.NET-Quellcode

    1. Function save(ByVal path As String)
    2. Try
    3. If ds.Tables.Count = 0 Then
    4. ds.Tables.Add(id)
    5. End If
    6. Dim ser As New XmlSerializer(GetType(DataSet))
    7. [color=#FF0000][/color]Dim writer As New StreamWriter(path)[color=#FF0000] [/color]< Error in dieser Zeile, Errorcode als zweite PNG anhgehängt
    8. ser.Serialize(writer, ds)
    9. writer.Close()
    10. writer.Dispose()
    11. writer = Nothing
    12. Catch ex As Exception
    13. Dim msg As Integer = MessageBox.Show("Error: 71, bitte wende dich an den Support" & vbNewLine & "Soll die ErrorMessage angezeigt werden?", "Fehler!", MessageBoxButtons.YesNo)
    14. If msg = DialogResult.Yes Then
    15. MessageBox.Show(ex.ToString, "ErrorMessage")
    16. ElseIf msg = DialogResult.No Then
    17. End If
    18. End Try
    19. End Function

    Auch hier wird wieder der Zugriff verweigert. Das Programm läuft im adminmode, sprich im app.manifest:

    VB.NET-Quellcode

    1. <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />


    @Cheffboss ja dass ist in der Tat kürzer, werde ich ändern :thumbsup:

    @VaporiZed Guter Einwand. Hatte ich anfangs aber auch erst für mich gedacht, sodasss ich erst mal testen kann, ohne das mir gleich alles abschmiert.
    Nachdem mein Error mit dem Zugriff gelöst wurde und das Programm soweit läuft, werde ich Deinen Rat befolgen.

    @Dksksm Leider weiß ich aus fehlender Kenntnis/Erfahrung nicht genau, was Du damit meinst, bzw. was ich expliziert ändern sollte.
    Bilder
    • Error.PNG

      93,47 kB, 616×492, 104 mal angesehen
    • save_error.PNG

      127,86 kB, 625×604, 56 mal angesehen
    ?(
    Laut: docs.microsoft.com/en-us/dotne…ile_Delete_System_String_
    Können 4 dinge das ganze auslösen:

    The caller does not have the required permission.
    The file is an executable file that is in use.
    path is a directory.
    path specified a read-only file.


    Desweiteren würde ich dir raten die ganzen Try-Catch-Blöche zu entfernen und die IDE fürs Debuggen zu nutzen.
    Das ist viel angenehmer und auch besser als nur diese Fehler auszugeben.
    Debuggen, Fehler finden und beseitigen
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @Silvergreen Starte Dein Programm mit Administratorrechten, das sollte helfen.
    Teste das im Explorer, rechte Maustaste und Ausführen mit Admin-Rechten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wenn ich in dein TMP Ordner speichere dann geht es ohne Error. Würde ich wenn sich keine lösung anbietet auch so machen. Würde es denn auch gehen das man den Ordner herrausfindet indem das Programm gespeichert ist? Das ist ja auf jedem Rechner anders, daher müsste ich das abfragen.
    EDIT: "Application.startuppath" das habe ich gefunden, aber auch hier das gleiche: Zugriff Verweigert

    @xChRoNiKx Ich konnte jetzt nocht nicht den Link "studieren" aber die Try Catch Blöcke habe ich entfernt. Den Link schaue ich später an

    @RodFromGermany Auch mit Rechtsklick und Administrator bleibt der Error.

    @ErfinderDesRades Danke, der Block geht jetzt
    ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Silvergreen“ ()

    Guten Morgen,

    ich habe das Problem jetzt mehr oder weniger gelöst. Eher bin ich es umgangen, indem ich die Dateien nun im Appdata speichere. Soweit funktioiniert das Programm jetzt auch.
    Ich denke das ich hier jetzt mal ein Thread mit den Funktionen des Programmes eröffne.

    Mfg Silvergreen
    ?(