Besser RemoveDirectory_() statt DeleteDirectory()
Besser RemoveDirectory_() statt DeleteDirectory()
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?)
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?)
@ 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().
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
- 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
>> 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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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. 

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- 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
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)

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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.
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.

PB 4.30
Code: Alles auswählen
Macro Happy
;-)
EndMacro
Happy End
- 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
@AND51
Deine Flagkombinationen sind sinnlos. Kannst ja noch nen DAU-Check hinzufügen
Deine Flagkombinationen sind sinnlos. Kannst ja noch nen DAU-Check hinzufügen

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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.
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
- 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
#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
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

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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