![]() |
Verzeichnis im Startmenü löschen
Moin !
Irgendwie stehe ich gerade aufm Schlauch ... Und zwar versuche ich im Startmenü unter "All Users" einen Ordner zu löschen. Der Ordner enthält einen Link. Diesen Link kann ich löschen. Der Ordner ist also def. leer. Anschließend versuche ich dann mit RemoveDir den Ordner zu löschen. Dort bekomme ich aber immer diesen Fehler (GetLastError): Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird Das erstaunliche ist nun ... Lasse ich die gleiche Routine danach nochmal laufen (der Ordner ist jetzt von vornerein leer), dann wird auch der Ordner anstandslos gelöscht. Ich habe schon gedacht es liegt evtl. daran das der Ordner einen Schribschutz hat. Aber dem ist nicht so. Hat jemand eine Idee (und ggf. ne Lösung) zu diesem obskuren Problem :gruebel: |
Re: Verzeichnis im Startmenü löschen
Falls Du einen Virenscanner installiert hast, kann es gut sein, das der Dir beim ersten Versuch in die Parade fährt.
|
Re: Verzeichnis im Startmenü löschen
Moin !
Ne auch mit abgeschaltetem Virenscanner gehts ned. |
Re: Verzeichnis im Startmenü löschen
Und wenn Du anstelle von RemoveDir
![]() |
Re: Verzeichnis im Startmenü löschen
Hallo,
füge in Deiner Routine, wenn der Fehler auftritt eine kleine Pause ein und versuche es dann nochmal (Sleep(1000) oder Sleep(5000)). Manchmal braucht das Betriebssystem etwas Zeit, bis es merkt, dass ein leerer Ordner gelöscht werden kann bzw. bis alle vorhergehende Operationen auf den / in dem zu löschenden Ordner abgeschlossen sind. |
Re: Verzeichnis im Startmenü löschen
Moin !
Tja ich habe jetzt mal 10 Sekunden gewartet und zusätzlich mittels SHFileOperation gelöscht:
Delphi-Quellcode:
Aber das Ergebnis ist 32. Und wenn man dann mal in die Winerror schaut steht da:
function ShellDelete(const fsoName: string): Integer;
var sh: SHFileOpStruct; iResult: Integer; begin ZeroMemory(@sh, sizeof(sh)); with sh do begin wFunc := fo_Delete; pFrom := PChar(fsoName + #0); fFlags := fof_Silent or fof_NoConfirmation or fof_NoErrorUI; end; Result := SHFileOperation(sh); end; Zitat:
|
Re: Verzeichnis im Startmenü löschen
Nachtrag:
Habe jetzt mal mit dem Process Explorer geschaut wer ein Handle auf den Ordner hat. Das ist nur meine Anwendung. Sonst nüscht. Ich blicks langsam nicht mehr :pale: |
Re: Verzeichnis im Startmenü löschen
Wie löscht du die Verknüpfung in dem Ordner?
|
Re: Verzeichnis im Startmenü löschen
Moin Luckie,
ich lösche ganz normal über:
Delphi-Quellcode:
Vorher prüfe ich noch ob ggf. ein Schreibschutz vorhanden ist und entferne den.
DeleteFile(FileList[j]);
Muss ich das anders machen !? |
Re: Verzeichnis im Startmenü löschen
.. in FileList[j] steht da der komplette Pfad, oder wechsest Du vorher in das Verzeichnis?
Grüße Klaus |
Re: Verzeichnis im Startmenü löschen
Moin !
In FileList[j] steht der ganze Pfad also z.B. C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\LogView V2 Test\Binary\PortmonXP Einen Wechsel mache ich nicht. Mein Verzeichnis löschen schaut so aus:
Delphi-Quellcode:
for j := FileList.Count -1 downto 0 do begin
if IsFolderEmpty(FileList[j]) then begin Log('Löschen leeres Verzeichnis : ' + FileList[j], ClMaroon, True); Log('Löschen : ' + IntToStr(ShellDelete(FileList[j])), clRed, True); //if NOT RemoveDir(FileList[j]) then // Log('Problem beim Löschen : ' + SysErrorMessage(GetLastError), clRed, True); end; end; |
Re: Verzeichnis im Startmenü löschen
Versuch doch trotzdem einfach mal vor dem Löschen des Verzeichnisses in ein anderes Verzeichnis zu wechseln, vielleicht setzt ja "irgendwas" das Verzeichnis, in dem du die Datei löschst, als aktives Verzeichnis.
Bis denn Bommel |
Re: Verzeichnis im Startmenü löschen
Moin !
Ich habe schon versucht mittels SetCurrentDir das Verzeichnis umzusetzen auf den normalen Anwendungspfad unter C:\Programme\... Hat aber auch nix genutzt. Und wenn ich mit GetCurrentDir eine Abfrage mache wo ich stehe wenn ich den Ordner löschen will, dann stehe ich irgendwo unter C:\Dokumente und Einstellungen\Administrator\Eigene Dateien Also nicht in dem Verzeichnis was ich löschen möchte. |
Re: Verzeichnis im Startmenü löschen
Liste der Anhänge anzeigen (Anzahl: 1)
Moin !
Ich bin einen Schritt weiter. Bevor ich die Verzeichnisse Lösche, lösche ich die darin befindlichen Shortcuts. Dafür erzeuge ich eine Liste mit allen *.LNK Files. Der Code schaut so:
Delphi-Quellcode:
Und der Code für ReadAllFilesInDir ...
FileList := TStringList.Create;
ReadAllFilesInDir(GetSpecialFolder(handle, DirCSIDL) + '\' + AppName + '\*.lnk', FileList);
Delphi-Quellcode:
Nachdem das ReadAllFilesInDir gelaufen ist habe ich auf dem Verzeichnis ein Handle. Und das bleibt auch bestehen wenn ich zu dem Codeteil komme wo ich das Verzeichnis löschen möchte.
Procedure ReadAllFilesInDir(mask: string; Var Liste : TStringList);
var search : TSearchRec; directory : string; begin directory := ExtractFilePath(mask); // find all files if FindFirst(mask, $23, search) = 0 then begin repeat // add the files to the listbox if (lowercase(search.Name) <> 'make.exe') AND (lowercase(search.Name) <> 'install.xml') then Liste.Add(ExpandFileName(directory + search.Name)); until FindNext(search) <> 0; end; // Subdirectories/ Unterverzeichnisse if FindFirst(directory + '*.*', faDirectory, search) = 0 then begin repeat if ((search.Attr and faDirectory) = faDirectory) and (search.Name[1] <> '.') then ReadAllFilesInDir(directory + search.Name + '\' + ExtractFileName(mask), Liste); until FindNext(search) <> 0; FindClose(search); end; end; Wenn ich das File Handle manuell per Process Explorer lösche, dann klappt auch das löschen des Verzeichnisses! Frage also ... Was erzeugt in dem obrigen Code ein Filehandle und wie kann ich das wieder los werden? Anbei noch eine Grafik ... |
Re: Verzeichnis im Startmenü löschen
.. wenn das Verzeichnis keine Unterverzeichnisse hat, wird findClose nicht aufgerufen.
Grüße Klaus |
Re: Verzeichnis im Startmenü löschen
innerhabl des ersten if-blocks (FindFirst) rufst du nirgends FindClose auf.
Warum rufst du eigentlich 2 mal FindFirst auf, für Dateien und Verzeichnisse getrennt? Warum nicht nur ein einziges mal aufrufen und anhand des Attributes entscheiden ob es ein Ordner ist oder nicht. Was auch komisch ist das du einmal $23 nimmst und im zweiten Fall mit Konstanten arbeitest. Warum nimmst du nicht generell Konstanten oder generell keine Konstanten? |
Re: Verzeichnis im Startmenü löschen
Moin !
Ich muss zu meiner Schande gestehen das die Funktion nicht von mir ist. Insofern kann ich die Fragen warum dies und das so und so gelöst wurde nicht beantworten :wink: Mit dem FindClose funktioniert die Sache nun aber schon mal Fehlerfrei :thumb: Werde dann mal die Funktion etwas umschreiben .... 8) Soweit aber erstmal vielen Dank für die Hilfe !! |
Re: Verzeichnis im Startmenü löschen
Moin !
So nun schaut das schon etwas universeller und läuft ohne Fehler :hi:
Delphi-Quellcode:
Procedure ReadAllFilesInDir(mask: string; Var Liste : TStringList;
readFolder, readFiles : Boolean); var sr : TSearchRec; directory : string; begin directory := ExtractFilePath(mask); if FindFirst(mask, faAnyFile, sr) = 0 then begin repeat if (lowercase(sr.Name) <> 'make.exe') and (lowercase(sr.Name) <> 'install.xml') and (sr.Name <> '.') and (sr.Name <> '..') and ((sr.Attr and faDirectory) <> faDirectory) then if readFiles then Liste.Add(ExpandFileName(directory + sr.Name)); if ((sr.Attr and faDirectory) = faDirectory) and (sr.Name <> '.') and (sr.Name <> '..') then begin if readFolder then Liste.Add(ExpandFileName(directory + sr.Name)); ReadAllFilesInDir(directory + sr.Name + '\' + ExtractFileName(mask), Liste, readFolder, readFiles); end; until FindNext(sr) <> 0; FindClose(sr); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz