Benutzer mit den meisten Antworten
kann den Ordner Favoriten nicht mit einem Programm löschen

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
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 FoldersGruß
Marcel
- Als Antwort markiert Peter_213 Montag, 5. November 2012 19:51
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 -
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-78dd08adac31und 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
-
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 FoldersGruß
Marcel
- Als Antwort markiert Peter_213 Montag, 5. November 2012 19:51
-
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