none
kann den Ordner Favoriten nicht mit einem Programm löschen RRS feed

  • Frage

  • Hallo an alle.

    Ich hätte da mal eine Frage ich bekomm das irgendwie nicht auf die Reihe.

    Warum kann ich den Ordner Favoriten nicht löschen (jedoch verschieben), wenn er vom Reset des IE erstellt worden ist? Von Hand kann ich den Ordner löschen nur nicht mit einem selbst geschriebenes c# Programm.

    Wie kann ich das umgehen und eben warum ist das so?

    Danke

    Gruss Peter

    Freitag, 2. November 2012 16:20

Antworten

  • Hallo Peter und Stefan,

    Peter, ich muss zugeben, dass mir eine solche Anforderung noch nie begegnet ist: Wozu einen Shell-Ordner löschen, der so tief mit der Betriebsystem-Shell und dem Internet Explorer verknüpft ist? - Die Frage ist wirklich nicht rhetorisch gemeint, ich möchte gerne verstehen, was dich dazu bewegt.

    Denn das ist kein 0815-Verzeichnis, was Du da löschen möchtest, sondern ein Shell-Ordner, d.h. ein Container-Objekt im Shell-Namensraum, das so tut als wäre es ein Verzeichnis, in Wirklichkeit aber nur eine Verzeichnis-Metapher implementiert.

    Löschen kann man natürlich auch einen Ordner wie "Favoriten", z.B. mittels der Windows API-Funktion SHFileOperation (man sollte aber tunlichst eine Kopie davon im Vorfeld erstellen!)

    Das Problem mit der Directory.Delete()-Methode ist, dass diese ein Wrapper um die Windows API RemoveDirectory()-Funktion ist, und als solche wohl problemlos Verzeichnisse löschen kann, aber nicht wirklich Shell-Ordner. Weil RemoveDirectory() auf das ShellObjekt nicht zugreifen kann, wird auch meist eine "Zugriff verweigert"-IOException geworfen (auch wenn Du zur Gruppe der Administratoren gehörst).

    Folgender Beispielcode verwendet die Klasse InteropSHFileOperation von pinvoke.net, um den Favoriten-Ordner in den Papierkorb zu verschieben. Bitte umsichtig damit umgehen und möglichst eine Kopie des gesamten Favoriten-Ordners (nicht nur Inhalt) vor der Ausführung erstellen:

    InteropSHFileOperation shFileOperation = new InteropSHFileOperation();
    
    // Keine Interaktion mit dem Benutzer
    shFileOperation.fFlags.FOF_NOCONFIRMATION = true;
    // Datei nicht löschen, sondern in den Papierkorb verschieben
    shFileOperation.fFlags.FOF_ALLOWUNDO = true;
    // Auszuführende Operation: Löschen
    shFileOperation.wFunc = InteropSHFileOperation.FO_Func.FO_DELETE;
    // Zu löschender Pfad
    shFileOperation.pFrom = Environment.GetFolderPath(Environment.SpecialFolder.Favorites);
    // Operation ausführen
    shFileOperation.Execute();
    
    Console.WriteLine("Der Favoriten-Ordner befindet sich im Papierkorb.");
    Console.ReadKey(true);
    


    Den Code habe ich unter Windows 7 getestet.

    Wenn es dir eher um das Verschieben des Favoriten-Ordners geht, als um das Löschen, sieh dich mal in der Registrierung um. Folgende Keys enthalten String-Werte, die geändert werden können:

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

    Gruß
    Marcel

    • Als Antwort markiert Peter_213 Montag, 5. November 2012 19:51
    Montag, 5. November 2012 14:36
    Moderator

Alle Antworten

  • Hallo Peter,

    wie lautet denn die genaue und vollständige Fehlermeldung?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 2. November 2012 16:53
    Moderator
  • Hallo Stefan,

    danke für die schnelle Rückmeldung. Hier die Fehlermeldung aus der Konsole.

    Unhandled Exception: System.IO.IOException: Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.

       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.Directory.Move(String sourceDirName, String destDirName)
       at ResetIE.Program.Main(String[] args)

    Dann habe ich noch zwei Fehler in der Computerverwaltung


    Ereignis-ID 1000
    Name der fehlerhaften Anwendung: ConsoleApplication4.exe, Version: 1.0.0.0, Zeitstempel: 0x5093d35a
    Name des fehlerhaften Moduls: KERNELBASE.dll, Version: 6.1.7601.17651, Zeitstempel: 0x4e2111c0
    Ausnahmecode: 0xe0434352
    Fehleroffset: 0x0000d36f
    ID des fehlerhaften Prozesses: 0x13c0
    Startzeit der fehlerhaften Anwendung: 0x01cdbb2def87eca7
    Pfad der fehlerhaften Anwendung: C:\Users\Peter\Desktop\ConsoleApplication4.exe
    Pfad des fehlerhaften Moduls: C:\windows\system32\KERNELBASE.dll
    Berichtskennung: 34355172-2721-11e2-ad2b-78dd08adac31

    und eine zweite eine .-Net Runtime Ereignis-ID 1026

    Application: ConsoleApplication4.exe
    Framework Version: v4.0.30319
    Description: The process was terminated due to an unhandled exception.
    Exception Info: System.IO.IOException
    Stack:
       at System.IO.__Error.WinIOError(Int32, System.String)
       at System.IO.Directory.Move(System.String, System.String)
       at ResetIE.Program.Main(System.String[])


    Das Programm läuft mit Administrationsrechte super durch. Doch ich muss doch den Ordner im eigenen Benutzerverzeichnis, auch ohne Administationsrechte löschen können. Von Hand geht das ja. Ein Programm übernimmt doch immer die Berechtiung von dem Benutzer der das Programm startet oder?

     Danke

    Gruss Peter



    • Bearbeitet Peter_213 Montag, 5. November 2012 09:01
    Montag, 5. November 2012 08:56
  • Hallo Peter und Stefan,

    Peter, ich muss zugeben, dass mir eine solche Anforderung noch nie begegnet ist: Wozu einen Shell-Ordner löschen, der so tief mit der Betriebsystem-Shell und dem Internet Explorer verknüpft ist? - Die Frage ist wirklich nicht rhetorisch gemeint, ich möchte gerne verstehen, was dich dazu bewegt.

    Denn das ist kein 0815-Verzeichnis, was Du da löschen möchtest, sondern ein Shell-Ordner, d.h. ein Container-Objekt im Shell-Namensraum, das so tut als wäre es ein Verzeichnis, in Wirklichkeit aber nur eine Verzeichnis-Metapher implementiert.

    Löschen kann man natürlich auch einen Ordner wie "Favoriten", z.B. mittels der Windows API-Funktion SHFileOperation (man sollte aber tunlichst eine Kopie davon im Vorfeld erstellen!)

    Das Problem mit der Directory.Delete()-Methode ist, dass diese ein Wrapper um die Windows API RemoveDirectory()-Funktion ist, und als solche wohl problemlos Verzeichnisse löschen kann, aber nicht wirklich Shell-Ordner. Weil RemoveDirectory() auf das ShellObjekt nicht zugreifen kann, wird auch meist eine "Zugriff verweigert"-IOException geworfen (auch wenn Du zur Gruppe der Administratoren gehörst).

    Folgender Beispielcode verwendet die Klasse InteropSHFileOperation von pinvoke.net, um den Favoriten-Ordner in den Papierkorb zu verschieben. Bitte umsichtig damit umgehen und möglichst eine Kopie des gesamten Favoriten-Ordners (nicht nur Inhalt) vor der Ausführung erstellen:

    InteropSHFileOperation shFileOperation = new InteropSHFileOperation();
    
    // Keine Interaktion mit dem Benutzer
    shFileOperation.fFlags.FOF_NOCONFIRMATION = true;
    // Datei nicht löschen, sondern in den Papierkorb verschieben
    shFileOperation.fFlags.FOF_ALLOWUNDO = true;
    // Auszuführende Operation: Löschen
    shFileOperation.wFunc = InteropSHFileOperation.FO_Func.FO_DELETE;
    // Zu löschender Pfad
    shFileOperation.pFrom = Environment.GetFolderPath(Environment.SpecialFolder.Favorites);
    // Operation ausführen
    shFileOperation.Execute();
    
    Console.WriteLine("Der Favoriten-Ordner befindet sich im Papierkorb.");
    Console.ReadKey(true);
    


    Den Code habe ich unter Windows 7 getestet.

    Wenn es dir eher um das Verschieben des Favoriten-Ordners geht, als um das Löschen, sieh dich mal in der Registrierung um. Folgende Keys enthalten String-Werte, die geändert werden können:

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

    Gruß
    Marcel

    • Als Antwort markiert Peter_213 Montag, 5. November 2012 19:51
    Montag, 5. November 2012 14:36
    Moderator
  • Hallo Marcel,

    super danke für die Antwort. So funktioniert das, dummer weise bin ich erst gar nicht auf die Idee gekommen das in den Papierkorb zu verschieben. Von dem mal abgesehen wollte ich das auch verstehen, warum das Löschen hier nicht funktionierte und auch hier hast du mir weitergeholfen. Danke J

    Du wolltest noch etwas genauer über den Sinn des Programms wissen. Wir haben öfters mal Probleme mit dem Internet Explorer und damit der IE sich die Einstellungen neu holt mussten wir diesen als reseten (doch so wie es aussieht haben wir jetzt das Problem mit einem Eintrag in das Hosfile gelöst). Nun die Idee war, dass der Benutzer das selber durchführen kann ohne dass wir da Handanlegen müssen. Wie du ja sicher weist wird bei dem Reset auch die Favoriten gelöscht darum habe ich am Anfang des Programms die Favoriten schon verschoben und damit ich die wieder zurück schieben kann muss ich die durch den Reset neu erstellt Favoriten löschen.

    nochmal vielen dank

    Gruss Peter

    Montag, 5. November 2012 20:44