Verzeichnis löschen...
Ja der Titel sagt es schon aber das ist noch längst nicht alles.
Ich starte mein Programm und es scannt Verzeichnisse. Dann wenn es läuft möchte ich gerne Verzeichnisse löschen - nur geht es nicht - das das Programm selbst einen Handle auf das zu löschenden Verzeichnis hat - muss erst mittels dem Tool Unlocker das Verzeichnis freigeben und dann kann es löschen. Wie komme ich ohne diesem Tool in den Genus das Verzeichnis zu löschen. Was ich meine falls es nicht verstanden ist das was man mit diesem Tool halt macht ;) |
Re: Verzeichnis löschen...
Wieso hast du ein Handle auf das Verzeichnis? Besorg dir den Pfad, gib das Handle frei und losch das ganzee dann nach dem Pfad.
|
Re: Verzeichnis löschen...
warum das so ist weis ich nicht - das passiert nur wenn ich mittels meiner suchefunktion - die verzeichnisse scanne!
Ok - aber wie geben ich so einen handle frei das ist ja mein problem ;( |
Re: Verzeichnis löschen...
Vielleicht mit einem CloseHandle?
|
Re: Verzeichnis löschen...
Hallo delphina!
Die Lösung mit dem genannten Tool ist äußerst fragwürdig. Eine Datei ist schließlich nicht ohne Grund gesperrt. Ich gehe mal davon aus, daß Du mittels FindFirst/FindNext den Verzeichnisbaum abscannst. Wenn Du nun unter definierten Umständen ein gefundenes Verzeichnis löschen möchtest, so mußt Du zuvor die Suche mit einem Findclose beenden. Dann wird auch das Handle zerstört und Du kannst Das Verzeichnis löschen. Hope it helps ansonsten: gib mal ein bißchen Code, dann gucke ich gerne mal drüber onlinekater |
Re: Verzeichnis löschen...
Danke das Findclose hat geholfen wie ein wunder ;) *danke*
Aber hier dennoch mal der code
Delphi-Quellcode:
procedure LV_InsertFiles(strPath: string; ListView: TlistView; ImageList: TImageList);
var i: Integer; SearchRec: TSearchRec; ListItem: TListItem; FileInfo: SHFILEINFO; begin ListView.Items.BeginUpdate; try i := FindFirst(strPath + '*.*', faAnyFile, SearchRec); while i = 0 do begin with ListView do begin if ((SearchRec.Attr and FaDirectory <> FaDirectory) and (SearchRec.Attr and FaVolumeId <> FaVolumeID)) then begin ListItem := ListView.Items.Add; SHGetFileInfo(PChar(strPath + SearchRec.Name), 0, FileInfo, SizeOf(FileInfo), SHGFI_DISPLAYNAME); Listitem.Caption := FileInfo.szDisplayName; Application.ProcessMessages; end; end; i := FindNext(SearchRec); end; finally ListView.Items.EndUpdate; Findclose(SearchRec); <---- nun eingefügt end; end; |
Re: Verzeichnis löschen...
Moin Doreen,
Du hast da allerdings noch ein kleines strukturelles Problem. Das FindClose wird in jedem Falle aufgerufen, auch wenn FindFirst fehlschlägt, und somit nichts zu schliessen ist. |
Re: Verzeichnis löschen...
hmmm das heisst das FindClose muss wo anders hin - und wenn ich es mir so anscheun inter das "i := FindNext(SearchRec); "..?!
|
Re: Verzeichnis löschen...
nein, das FindClose steht schon an der richtigen Stelle.
[Edit] Die Stelle, die Du eben vorgeschlagen hast, würde die Suche immer nach dem zweiten ergebnis beenden und dann unweigerlich zum Fehler führen. [Edit/] Du soltest das Findfirst in die Zeile vor dem try setzen. @Christin Seehase Ein FindClose ist auch dann angesagt, wenn das FindFirst fehlschlägt: Auszug aus SysUtils:
Delphi-Quellcode:
Gruß
function ForceDirectories(Dir: string): Boolean;
{ FindFirst searches the directory given by Path for the first entry that matches the filename given by Path and the attributes given by Attr. The result is returned in the search record given by SearchRec. The return value is zero if the function was successful. Otherwise the return value is a system error code. After calling FindFirst, always call FindClose. FindFirst is typically used with FindNext and FindClose as follows: Result := FindFirst(Path, Attr, SearchRec); while Result = 0 do begin ProcessSearchRec(SearchRec); Result := FindNext(SearchRec); end; FindClose(SearchRec); where ProcessSearchRec represents user-defined code that processes the information in a search record. } Thomas |
Re: Verzeichnis löschen...
@onlinekater: Ein FindClose ist nur dann notwendig wenn FindFirst klappt. Ansonsten ist das zurückgelieferte Handle innerhalb der Struktur 0 und muss somit nicht frei gegeben werden. Allerdigns prüft FindClose ob eben dieses Handle 0 ist und gibt es dann nicht frei. Es ist aber eben sinnvoller FindClose nur aufzurufen wenn es wirklich aufgerufen werden muss. Schließlich ruft man ja auch nicht 10 mal hintereinander FreeAndNil auf nur weil es eben geht. Man sollte eine Funktion generell nur aufrufen wenn es sinn macht und das ist bei FindClose eben nur der Fall wenn FindFirst erfolgreich war. Ansonsten ist es einfach nur ein überflüssiger Aufruf der unnötig Rechenschritte kostet.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz