AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Einen Ordner komplett löschen

Ein Thema von qb-tim · begonnen am 26. Mai 2006 · letzter Beitrag vom 6. Okt 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von qb-tim
qb-tim

Registriert seit: 3. Mär 2006
Ort: Deutschland
280 Beiträge
 
Delphi 6 Professional
 
#11

Re: Einen Ordner komplett löschen

  Alt 26. Mai 2006, 17:38
Danke!

Das war der fehler!
  Mit Zitat antworten Zitat
Benutzerbild von Glühwürmchen
Glühwürmchen

Registriert seit: 31. Okt 2003
Ort: Pfinztal
156 Beiträge
 
Delphi 2010 Professional
 
#12

Re: Einen Ordner komplett löschen

  Alt 6. Okt 2006, 08:49
Es gibt bereits sooo viele Threads zu dem Thema, daß ich mir einfach mal DEN hier rauspicke:

Thema: RemoveDir funzt nicht!
Unterthema: RemoveDir funzt manchmal(!) nicht.

Ich habe alle Threads in der DP wieder und wieder durchgelesen. Viele nutzen diese SHFileOperation-Funktion. Leider ruft die aber "ZeroMemory" oder sowas auf und mein Delphi 5 kann damit nichts anfangen.

Also habe ich die Funktionen von SirThornberry "DeleteFiles" und "DeleteDirectory" benutzt, in der Hoffnung, daß diese besser tun, als meine eigenen.
Naja, es war ein Versuch wert.

Folgendes Problem:
Ich lege im Programm (per Button-Klick) mit "ForceDirectories(Dir)" Verzeichnisse an, in die ich mit "CopyFile" Dateien hinein kopiere.
Gleich im nächsten Schritt (natürlich nur in der Testphase) lösche ich (per Button-Klick) alle gerade angelegten Verzeichnisse inklusive aller in ihnen enthaltenen Dateien wieder.

In allen Fällen werden restlos alle Dateien gelöscht. ABER:
Nur in 50 Prozent der Fälle werden auch alle Verzeichnisse gelöscht!
In den anderen 50 Prozent läßt das Programm ein paar LEERE Verzeichnisse zurück. Um nichts in der Welt ist mein Programm hinterher nochmal dazu zu bewegen, diese Leichen ebenfalls noch zu entfernen!
Lösche ich sie jedoch von Hand und starte einen neuen Durchlauf, mit den gleichen Startbedingungen, dann stehen die Chancen 1:2 daß diesmal alle Verzeichnisse gelöscht werden.

Lege ich von Hand Verzeichnisse an, löscht das Programm sie niemals!


Der folgende Quellcode kann von Euch so nicht ausprobiert werden, da Euch alle selbst geschrieben Methoden u.ä. fehlen. Er dient nur dazu, ein bißchen einen Überblick zu bekommen was ich tue...

Zum Kopieren:
Delphi-Quellcode:
  // Suche in jedem ...
  for iDvzIdx := 0 to ZSI.iGetAnzUnterDVZ - 1 do begin
    // ... der angegebenen Unter-Verzeichnisse ...
    if ZSI.bGetUnterDvzStatus((ZSI.slGetUnterDVZ)[iDvzIdx]) = TRUE then begin
      // ... nach jedem ...
      for iTypIdx := 0 to ZSI.iGetAnzTypenAM - 1 do begin
        // ... der ausgewählten Datei-Typen ...
        if ZSI.bGetDateiTypStatus((ZSI.slGetDateiTypenAM)[iTypIdx]) = TRUE then begin
          // ... und kopiere diese in´s Ziel-Verzeichnis.
          sQuelle := ZSI.sGetQuellDVZ + (ZSI.slGetUnterDVZ)[iDvzIdx] + '\';
          sTeilVerzeichnis := ZSI.sGetUnterDVZ_OhneErstes((ZSI.slGetUnterDVZ)[iDvzIdx]);
          sZiel := ZSI.sGetZielDVZ + '\' + sTeilVerzeichnis + '\';

          if SindFilesinDir(sQuelle, '*.' + (ZSI.slGetDateiTypenAM)[iTypIdx], TRUE) = TRUE then begin
            DirErzeugen(sZiel);
            sDatei := '*.' + (ZSI.slGetDateiTypenAM)[iTypIdx];
            CopyFiles(sQuelle, sZiel, sDatei, FALSE);
          end;
        end; // end - if
      end; // end - for
    end; // end - if
  end; // end - for
Zum Löschen:
Delphi-Quellcode:
function TFrmZipSave.DeleteDirectory(ADirName: String): Boolean;
var
  LRec : TSearchRec;
  
begin
  DeleteFiles(ADirName + '\*');
  if FindFirst(ADirName + '\*', faDirectory, LRec) = 0 then
  begin
    repeat
      if (copy(LRec.name, 1, 1) <> '.') and DirectoryExists(ADirName + '\' + LRec.Name) then
        DeleteDirectory(ADirName + '\' + LRec.Name)
      ;
    until FindNext(LRec) <> 0;
  end;
  SysUtils.FindClose(LRec);

  result := RemoveDir(ADirName);
  if result = TRUE then begin
    iAnzDvzGeloescht := iAnzDvzGeloescht + 1;
    pnlErgebnis.Caption := IntToStr(iAnzDateienWeg) + ' Dateien und ' +
                           IntToStr(iAnzDvzGeloescht) + ' Verzeichnisse gelöscht...';
    Application.ProcessMessages;
  end;
end; {*** DeleteDirectory ***}

procedure TFrmZipSave.DeleteFiles(FilenameMask: String);
var
  LRec : TSearchRec;
  LPath : String;
  bResult : Boolean;
    
begin
  if FindFirst(FilenameMask, faAnyFile + $80 + $2000, LRec) = 0 then begin
    LPath := ExtractFilePath(FilenameMask);
    repeat
      if (LRec.Name <> '.') and (LRec.Name <> '..') then begin
        // ggf. Schreibschutz entfernen
        If (LRec.Attr and SysUtils.faReadOnly) <> 0 then
          FileSetAttr(LPath + LRec.Name, LRec.Attr - SysUtils.faReadOnly)
        ;
        
        bResult := SysUtils.DeleteFile(LPath + LRec.Name);
        if bResult = TRUE then begin
          iAnzDateienWeg := iAnzDateienWeg + 1;
          pnlErgebnis.Caption := IntToStr(iAnzDateienWeg) + ' Dateien und ' +
                                 IntToStr(iAnzDvzGeloescht) + ' Verzeichnisse gelöscht...';
          Application.ProcessMessages;
        end;
      end;
    until FindNext(LRec) <> 0;
  end;
  SysUtils.FindClose(LRec);
end; {*** DeleteFiles ***}
Meine Frage:
Woran kann es liegen, daß RemoveDir mal tut und mal nicht?
Gibt es vielleicht irgendwelche DateiAttribute, die ich noch abfragen sollte?
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Einen Ordner komplett löschen

  Alt 6. Okt 2006, 09:09
Zitat von Glühwürmchen:
Viele nutzen diese SHFileOperation-Funktion. Leider ruft die aber "ZeroMemory" oder sowas auf und mein Delphi 5 kann damit nichts anfangen.
Strukturen kann man auch mit Delphi-Referenz durchsuchenFillChar initialisieren.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#14

Re: Einen Ordner komplett löschen

  Alt 6. Okt 2006, 09:16
@Glühwürmchen
Button1 auf Form legen.
C:\test anlegen
Einige Dateien unter C:\test rein. Stetze einige Dateien auf Hidden oder Versteckt.
Button1 betätigen und Du wirst sehen: Alles gelöscht!
Selbst gerade probiert. Ich glaube DelDir ist Torrycode.

Delphi-Quellcode:
function DelDir(dir: string): Boolean; {$IFDEF INLINE}INLINE;{$ENDIF}
var
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc := FO_DELETE;
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    pFrom := PChar(dir + #0);
  end;
  Result := (0 = ShFileOperation(fos));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
DelDir('C:\test');
if DirectoryExists('C:\test') then ShowMessage('DelDir fehlgeschlagen') else
ShowMessage('DelDir funktioniert');
end;
Und: Geht es jetzt?
Gruß Go2EITS
  Mit Zitat antworten Zitat
Benutzerbild von Glühwürmchen
Glühwürmchen

Registriert seit: 31. Okt 2003
Ort: Pfinztal
156 Beiträge
 
Delphi 2010 Professional
 
#15

Re: Einen Ordner komplett löschen

  Alt 6. Okt 2006, 09:23
@Go2EITS

Undefinierter Bezeichner: 'TSHFileOpStruct'

Was ist TorryCode?

@luckie
FillChar?
Habe die Hilfe gelsen, aber - was soll ich damit?
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Einen Ordner komplett löschen

  Alt 6. Okt 2006, 09:25
ShellAPI eingebunden?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#17

Re: Einen Ordner komplett löschen

  Alt 6. Okt 2006, 09:34
@Glühwürmchen
Sorry, hab nicht aufgepasst und Uses mitgeteilt.
Filectrl unter USES für Directoryexits einfügen.


Torrycode?
Damit meine ich die hervorragenden Snippets für Delphi hier:
"Torrycode"
(Sucheseite) unter Tips kannst Du die die Kategorie "manuell" auswählen.
  Mit Zitat antworten Zitat
Benutzerbild von Glühwürmchen
Glühwürmchen

Registriert seit: 31. Okt 2003
Ort: Pfinztal
156 Beiträge
 
Delphi 2010 Professional
 
#18

Re: Einen Ordner komplett löschen

  Alt 6. Okt 2006, 09:39
ShellAPI und FileCtrl einzubinden haben das Compiler-Problem gelöst.

Aber das Programm tut nicht.
Alle rüberkopierten Dateien sind weg.
Das Verzeichnis wiedersteht jedoch dem Löschversuch: "DelDir fehlgeschlagen" (ABER ES IST DA!!)
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#19

Re: Einen Ordner komplett löschen

  Alt 6. Okt 2006, 09:41
Was liefert denn SHFileOperation für einen Fehlercode zurück?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Glühwürmchen
Glühwürmchen

Registriert seit: 31. Okt 2003
Ort: Pfinztal
156 Beiträge
 
Delphi 2010 Professional
 
#20

Re: Einen Ordner komplett löschen

  Alt 6. Okt 2006, 09:42
hm, bei zwei weiteren Versuchen ging es.
Gruß Glühwürmchen
<><
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:35 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