Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verzeichnis löschen... (https://www.delphipraxis.net/66185-verzeichnis-loeschen.html)

delphinia 26. Mär 2006 12:42


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 ;)

Ratte 26. Mär 2006 12:55

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.

delphinia 26. Mär 2006 12:59

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 ;(

dahead 26. Mär 2006 13:06

Re: Verzeichnis löschen...
 
Vielleicht mit einem CloseHandle?

TBx 26. Mär 2006 13:07

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

delphinia 26. Mär 2006 13:12

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;

Christian Seehase 26. Mär 2006 13:26

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.

delphinia 26. Mär 2006 13:28

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); "..?!

TBx 26. Mär 2006 13:40

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:
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. }
Gruß

Thomas

SirThornberry 26. Mär 2006 13:53

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.
Seite 1 von 2  1 2      

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