Seite 1 von 2

Besser RemoveDirectory_() statt DeleteDirectory()

Verfasst: 16.11.2006 21:52
von al90
Hi Leuts,

Für mein jüngstes project (DateiManager ala TC) möchte ich auch eine
Delete Option anbieten. Nur dabei gibts es ein problem. Nähmlich
den DeleteDirectory() Befehl von PB. Dieser löscht nähmlich anstatt
nur Empty Directorys leider auch alle darunter befindlichen Files. Für mein
vorhaben also unbrauchbar. (Und vorallendingen SEHR GEFÄHRLICH)
Stattdessen benutze ich jetzt den API-Befehl RemoveDirectory_()
und mit dem ergebniss bin ich sehr zufrieden. Der grund für den verzicht
auf DeleteDirectory() ist folgender:

Im DateiManager wähle ich einen Ordner zum Löschen aus. Jetzt sollen
allerdings z.b. Hidden&System Files NICHT gelöscht werden.
Sobald das Tool die zählung zum OberOrdner erreicht hat, soll das
Directory gelöscht werden. (Sofern es leer ist)
DeleteDirectory() löscht in diesem fall aber alles. Mit RemoveDirectory()
dagegen klappt alles bestens und der Ordner mit dem Datei-Inhalt bleibt bestehen.

Mein Vorschlag daher:

Der DeleteDirectory() Befehl sollte unbedingt geändert werden.
Ich verstehe auch nicht wieso Pattern$ nicht optional ist ?!
Wäre es denn nicht besser wenn der Befehl grundsätzlich wie
das API gegenstück nur EmptyDirs löscht und erst mit Pattern$ (*.*)
alles darunter mitlöscht ?

Vielleicht sollte man den vorschlag mal Fred unterbreiten? (Falls nicht schon geschehen?)

Verfasst: 16.11.2006 22:14
von AND51
@ Pattern: Um konform mit ExamineDirectory() zu bleiben, bedeutet ein Leerstring als Pattern "", dass alles gelöscht werden soll. "" ist also gleich "*.*".

Ich finde, man sollte den Befehl behalten, denn später kommt wiede einer, der meckert, dass es kein befehl gibt, um komplette verzeichnisse zu löschen.

Mein Vorschlag ist eher, al90's vorschlag mit in PB aufzunehmen, allerdings inform des PB Befehls RemoveDirectory() oder inform eines zusätzlichen (optionalen) Flags bei DeleteDirectory().

Verfasst: 16.11.2006 22:31
von ts-soft
>> wenn der Befehl grundsätzlich wie das API gegenstück nur
Gibts den ein "API gegenstück" für Linux und MacOS. Windowsspezifische
Sachen sollten auch so genutzt werden. Gerade im Dateisystem
unterscheiden sich die Betriebssysteme extrem. Wenn es grundsätzlich
überall umsetzbar wäre, spricht allerdings nichts dagegen.

yust my 2 cents

Verfasst: 16.11.2006 22:36
von AND51
al90, wie wäre es, wenn du eine Alternativprozedur codest,, und sie hier rein stellst? Dann haben wir alle was von dem behl, solange Freed/Freak sich nicht drum gekümert hat. :allright:

Verfasst: 16.11.2006 23:22
von ts-soft

Code: Alles auswählen

#PB_FileSystem_RemoveEmpty = 3

Procedure RemoveDirectory(SourceDirectory$, Pattern$, Flags.l)
  If Flags = #PB_FileSystem_RemoveEmpty
    ProcedureReturn RemoveDirectory_(SourceDirectory$)
  Else
    ProcedureReturn DeleteDirectory(SourceDirectory$, Pattern$, Flags)
  EndIf
EndProcedure

Macro DeleteDirectory(SourceDir, Pattern, Flags = 0)
  RemoveDirectory(SourceDir, Pattern, Flags)
EndMacro

DeleteDirectory("E:\temp\temp", "", #PB_FileSystem_RemoveEmpty)
:mrgreen:

Verfasst: 16.11.2006 23:52
von AND51
So in etwa, aber was, wenn ich unwissentlich für flags folgendes angebe: #PB_FileSystem_Force|#PB_#PB_FileSystem_RemoveEmpty
oder
#PB_FileSystem_Recursive|#PB_#PB_FileSystem_RemoveEmpty?
Oder, wenn ich #PB_FileSystem_Recursive extra weglasse, weil ich bewusst nicht auf unterordner achte und dafür auch hinnehme, dass wegen eventueller Unterordner das verzeichnis nicht gelöscht wird?

Dann greift deine Prozedur in die Kacke... Aber trotzdem: Der Anfang ist shcon mal gemacht. :allright:

Verfasst: 16.11.2006 23:54
von ts-soft
@AND51
Deine Flagkombinationen sind sinnlos. Kannst ja noch nen DAU-Check hinzufügen :mrgreen:

Verfasst: 16.11.2006 23:57
von AND51
Wieso das denn? Angenommen, ich will ein Verzeichnis nur löschen, wenn es leer ist. Dann nehme ich #PB_FileSystem_RemoveEmpty.

Nun habe ich noch die Möglichkeit, das Verzeichnis als leer betrachten zu lassen, auch wenn (leere oder wie auch immer geartete) Unterordner vorhanden sind, dann nehme ich #PB_FileSystem_Recursive.
Wenn ich nur die 1. ebene betrachen will, gilt der Ordner nur als leer, wenn er wirklich leer ist, also nur die Einträge "." und ".." enthält.

Verfasst: 17.11.2006 00:02
von ts-soft
#PB_FileSystem_RemoveEmpty löscht nur wirklich leere Ordner, anders ist es
in der API nicht vorgesehen. Rekursive leere Ordner kenne ich nicht.
Erzwingen, das er leer ist, kann man es auch nicht, dafür muß man wohl mit
DeleteFile oder ähnlich sorgen :lol:

Verfasst: 17.11.2006 00:09
von AND51
Ich glaub langsam, ich weiß, was du meinst... OK ich glaube auch, dass du recht hast. :)