Besser RemoveDirectory_() statt DeleteDirectory()

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
al90
Beiträge: 1103
Registriert: 06.01.2005 23:15
Kontaktdaten:

Besser RemoveDirectory_() statt DeleteDirectory()

Beitrag 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?)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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().
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@AND51
Deine Flagkombinationen sind sinnlos. Kannst ja noch nen DAU-Check hinzufügen :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich glaub langsam, ich weiß, was du meinst... OK ich glaube auch, dass du recht hast. :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Gesperrt