Problem mit "Documents" / Eigene Dateien

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von _Arthur_.

    Problem mit "Documents" / Eigene Dateien

    Hi Leute,

    ich habe ein ganz seltsames kleines Problem:
    Ich habe für einen Kunden ein kleines einfaches Backup-Tool gebastelt (ich verwende MS Visual Studio 2013 Express), in welchem ein Quell- und ein Zielordner festgelegt werden kann. Per Knopfdruck werden dann die Inhalte beider Ordner inkl. Unterordner verglichen. Gibt es Unterschiede, werden diese entsprechend ausgeglichen (immer von Quelle --> Ziel).
    So weit so gut, es funktioniert eigentlich auch alles, allerdings möchte der Kunde den kompletten Inhalt aus seinem "Dokumente"-Ordner sichern (er verwendet Windows 7). Wenn ich diesen Ordner einstelle (und da spielt es keine Rolle, ob ich über "Bibliotheken" --> "Dokumente" oder über "C:\Users\[Benutzername]\Documents" gehe, sobald ich die Routine starte (sie zählt zunächst alle Dateien im Quellordner, um diesen Wert als Maximum für eine Progressbar festzulegen, welche dann den Fortschritt anzeigt), erhalte ich die Fehlermeldung "Der Zugriff auf den Pfad "C:\Users\[Benutzername]\Documents\Eigene Bilder" wurde verweigert.", was vollkommen logisch ist, da sich ein solcher Ordner gar nicht im "Documents"-Ordner befindet! Ich habe das inzwischen auf zwei weiteren W7-Rechnern ausprobieret - immer das gleiche Phänomen!

    Was kann ich hier tun? Wie kommt der überhaupt darauf, einen Ordner öffnen zu wollen, der sich überhaupt nicht im Quell-Ordner befindet?

    Danke schon mal im Voraus!

    Ciao Arthur

    _Arthur_ schrieb:

    "Der Zugriff auf den Pfad "C:\Users\[Benutzername]\Documents\Eigene Bilder" wurde verweigert.", was vollkommen logisch ist, da sich ein solcher Ordner gar nicht im "Documents"-Ordner befindet!
    Das ist nicht vollkommen logisch - im Gegenteil: Bei einem fehlenden Ordner muss eine andere Fehlermeldung erfolgen.
    Normaller weise wird jede Anwendung mit den Rechten des angemeldeten Benutzers gestartet und ausgeführt, Anwendungn haben zwar per defination im Netzframework iwo die möglichkeit die Rechte zu wecshseln aber dass ist erstmal völlig uminteresant!

    Viel Interesanter ist ja die Frage ob du auf denn Ordner normall in Windows Explorer zugreifen kannst? Bei nicht exsitirenden Ordnern kommt sowas wie ne DirectoryNotFoundException. Dass kann man aber eigentlich auch entweder vorher mit IF abfangen (besser Wahl) und den Ornder erstellen und dann einfach Rekursiv die Eigene funktion aufrufen und normall mit den neu erstellten Ordner weiter Arbeiten.

    Der Zweite Weg ist mit TryCatch die Exception abfangen (das catch ex as exception aber gegen ex as DirectoryNotFoundException) ersezen. In der Abgefangenen Exception dann einfach dort den Ordner erstellen und wieder Rekurisiv aufrufen.

    LG, Herbrich

    ErfinderDesRades schrieb:

    Das ist nicht vollkommen logisch - im Gegenteil: Bei einem fehlenden Ordner muss eine andere Fehlermeldung erfolgen.

    Du hast natürlich Recht, das ist mir in meiner Verwirrung gar nicht aufgefallen. Fakt ist allerdings, dass es auf keinem der drei Rechner, auf denen ich das getestet habe, einen Ordner namens "Eigene Bilder" als Unterordner von "...Documents" gibt!
    Das Ganze passiert bereits bei diesem Aufruf:

    VB.NET-Quellcode

    1. ProgressBar1.Maximum = My.Computer.FileSystem.GetFiles(My.Settings.Quelle, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count

    Wobei sich hinter "My.Settings.Quelle" aktuell der Pfad "C:\Users\[Benutzername]\Documents" verbirgt (das ist sicher gestellt, da dieser Wert in einer TextBox ausgegeben und korrekt angezeigt wird).

    @Herbrich
    Danke für die Tipps, aber es wird ja keine DirectoryNotFoundException ausgeworfen, sondern eine UnauthorizedAccessException. Und mir geht es in erster Linie erst einmal darum, zu verstehen, wieso ein Zugriff auf einen Ordner versucht wird, welcher sich gar nicht im angegeben Pfad befindet. Und (das wäre jetzt die Frage, die eben hinzugekommen ist) wieso wirft dieser Versuch eine UnauthorizedAccessException und keine DirectoryNotFoundException aus?

    Ich bin ziemlich ratlos!?!

    _Arthur_ schrieb:

    UnauthorizedAccessException
    Was passiert, wenn Du im Explorer auf genau diesen Ordner zugreifen willst?
    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!
    Hi Rod,

    da es diesen Ordner nicht gibt, kann da auch nix passieren.
    Gebe ich den Pfad händisch in die Adresszeile ein, kommt der Fehler "Der Pfad ist nicht verfügbar" und "Auf "C:\Users\[Benutzername]\Documents\Eigene Bilder" kann nicht zugegriffen werden." und "Zugriff verweigert".

    Interessanterweise berichtet garack in diesem Thread in seiner dritten Wortmeldung von exakt dem gleichen Problem. Da dort aber noch mehr schief läuft, ist das vermutlich noch gar niemandem aufgefallen ...
    allerdings möchte der Kunde den kompletten Inhalt aus seinem "Dokumente"-Ordner sichern
    versuche einmal wie unten den Pfad der EigenenDateien des Benutzers zu definieren...

    VB.NET-Quellcode

    1. Dim myFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

    System.Environment.Specialfolder-Enumeration

    _Arthur_ schrieb:

    Du hast natürlich Recht, das ist mir in meiner Verwirrung gar nicht aufgefallen. Fakt ist allerdings, dass es auf keinem der drei Rechner, auf denen ich das getestet habe, einen Ordner namens "Eigene Bilder" als Unterordner von "...Documents" gibt!
    Nein - gibt es nicht.

    Windows mogelt da iwas herum. In Wirklichkeit heißt der Ordner "Pictures", aber im deutschen Gebietsschema zeigt der WinExplorer tollerweise "Eigene Bilder" an.

    Aber wie gesagt: Du hast mit 2 verschiedenen Fehlern zu tun, die nix miteinander zu tun haben.
    UnauthoriszedAccess meldet dir, dass iein Unterordner nicht zugreifbar ist für dich.

    DirectoryNotFound meldet dir, dass ein anderer Ordner garnet existiert.
    Jein - dass der Ordner tatsächlich "Pictures" heißt, ist schon klar, aber auch dieser ist KEIN Unterordner von "Documents" oder "Eigene Dokumente".

    Noch einmal etwas ausführlicher:
    Der User wählt in einem Setup-Dialog seinen Quell- und seinen Ziel-Ordner. Hierfür habe ich ein FolderBrowserDialog-Control platziert, dessen .SelectedPath-Eigenschaft ich in den Settings speichere und für die eigentliche BackUp-Aktion sowie für die Anzeige der Progressbar wieder aufrufe (siehe oben). Und in diesem Dialog kann ich entweder "Bibliotheken" --> "Dokumente" oder "C:\Users\[Benutzername]\Documents" auswählen (gespeichert wird in beiden Fällen letzteres), was zu dem beschriebenen Verhalten führt.

    @'VB1963:
    Das habe ich interessehalber mal probiert und voilá: es läuft ohne Fehler, allerdings kann ich das so nicht nutzen, da ein anderer User vielleicht seine Daten, welche sich unter "D:\MeineDaten" befinden, sichern möchte. Und wenn der Ordner über den Dialog ausgewählt wird, hab ich wieder das Problem.
    Okay, okay, ich könnte natürlich den Pfad "C:\Users\[Benutzername]\Documents" abfragen und durch "Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)" ersetzen (was ich vermutlich erst einmal tun werde, um bei dem aktuellen Kunden weiter zu kommen), aber die Frage, die ich klären möchte ist doch die, wieso die Routine versucht, auf einen Ordner zuzugreifen, welcher sich definitiv nicht in dem angegebenen übergrordneten Ordner befindet.

    Nachtrag:
    Jetzt war ich zu voreilig ... und jetzt wird es ganz verrückt. Wenn die Form geladen wird, setze ich schon mal den Maximum-Wert für die Progressbar. Hier wurde bereits der Fehler ausgeworfen. Das mache ich jetzt mit

    VB.NET-Quellcode

    1. Dim quelle As String = My.Settings.Quelle
    2. Dim Benutzername As String = My.User.Name.ToString.Split("\")(1)
    3. If quelle = "C:\Users\" & Benutzername & "\Documents" Then quelle = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    4. ProgressBar1.Maximum = My.Computer.FileSystem.GetFiles(quelle, FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count

    Das funktioniert, ohne Probleme. Da nun aber die Möglichkeit besteht, dass der User das Programm startet und dann noch Dateien im Quellordner ändert, hinzufügt oder löscht, frage ich die Zahl noch einmal direkt beim Start der Backup-Routine ab und aktualisiere die Progressbar-Eigenschaft. Hierfür habe ich den Code aus der Load-Sub kopiert und in der Backup-Routine eingefügt. Und der gleiche Code, der beim Laden der Form ohne Probleme durchläuft, bringt mir später wieder den genannten Fehler!

    ?(

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

    _Arthur_ schrieb:

    aber die Frage, die ich klären möchte ist doch die, wieso die Routine versucht, auf einen Ordner zuzugreifen, welcher sich definitiv nicht in dem angegebenen übergrordneten Ordner befindet.
    Du kannst ja mal ein kleines Testprojekt machen und anhängen, was speziell diese Wunderlichkeit reproduziert.
    Der Ordner existiert tatsächlich. .NET gaukelt dir nichts vor. Wenn du "Geschützte Systemdateien ausblenden" in den Explorer-Einstellungen deaktivierst, siehst du diesen Ordner.

    Du kannst deine Abfragen in einen Try-Catch-Block packen, oder die Berechtigungen des Ordners abfragen, ob der aktuelle Nutzer überhaupt Zugriff hat.
    Dieser Ordner existiert nurnoch aus Kompatibilitätsgründen für Windows XP. Seit Windows Vista ist dieser Ordner auf allen Systemen vorhanden. Auch im Explorer wird eine UnauthorizedAccessViolationException geworfen.
    Weiteres findest du hier: stackoverflow.com/questions/10…y-user-documents-my-music

    _Arthur_ schrieb:

    wieso die Routine versucht, auf einen Ordner zuzugreifen, welcher sich definitiv nicht in dem angegebenen übergrordneten Ordner befindet.
    Ich tippe stark auf Junctions.
    In diesen Verzeichnisse macht Microsoft jede Menge damit.
    C:\Users\ ist beispielsweise ein Hardlink auf C:\Benutzer\ (oder umgekehrt).
    Und das ist lange noch nicht alles.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich glaub, _arthur_ vertut sich die ganze Zeit.
    Natürlich ist der Ordner vorhanden, _arthur_ hat blos keine Rechte. Das heißt aber nicht, dass der Ordner nicht da ist.
    Also das finde ich die einfachste Erklärung des Wunders, dass .GedDirectories() Ordner liefern sollte, die es nicht gibt.
    Wie AliveDevil sagt: Klar gibts den Ordner, nur er hat keine Rechte, reinzugucken.
    Den Unterschied muss man halt auseinanderhalten, sonst ist man tagelang mit der Lösung von Problemen beschäftigt, die garnet da sind (sondern es sind andere Probleme da).

    ErfinderDesRades schrieb:

    Klar gibts den Ordner, nur er hat keine Rechte
    Ja, das sehe ich jetzt auch als wahrscheinlichste Variante an, nachdem ich oben die Fehlermeldung gelesen hatte:
    Der Zugriff auf den Pfad "C:\Users\[Benutzername]\Documents\Eigene Bilder" wurde verweigert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi Leute,

    danke für Eure Hilfestellung, besonderen Dank an AliveDevil für die Aufklärung des Mysteriums. Ich hatte gar nicht gewusst, dass es neben versteckten Datzeien noch "verstecktere" gibt.
    Ich bin in den letzten Tagen nicht dazu gekommen, mich um das Problem zu kümmern und komme auch nicht so bald dazu - für den Kunden muss ich mir etwas einfallen lassen ...

    Ciao Arthur