Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Verzeichnis recursive übers Netzwerk löschen (https://www.delphipraxis.net/166868-verzeichnis-recursive-uebers-netzwerk-loeschen.html)

RWarnecke 3. Mär 2012 10:38


Verzeichnis recursive übers Netzwerk löschen
 
Hallo zusammen,

ich schreibe gerade ein Programm, welches über ein 100MBit-Netzwerk Daten in einem Gesamtumfang von ca. 40GB löschen muss.

1.) Welche Erfahrungen habt Ihr gemacht mit der Funktion MSDN-Library durchsuchenRemoveDirectory und der Funktion DelDir von den Schweizern ?
2.) Welche der beiden Funktionen ist besser und sicherer ?
3.) Welche der beiden Funktionen ist schneller ?

Gruß
Rolf

Bernhard Geyer 3. Mär 2012 10:53

AW: Verzeichnis recursive übers Netzwerk löschen
 
Frage 4 Fehlt: Welche Funktioniert

Lese mal die MSDN-Doku zu RemoveDirectory:

Zitat:

This path must specify an empty directory, ...
und dann auch noch das:

Zitat:

... recursively delete the files in a directory, use the SHFileOperation function.
:-)

RWarnecke 3. Mär 2012 11:07

AW: Verzeichnis recursive übers Netzwerk löschen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1154266)
Frage 4 Fehlt: Welche Funktioniert

Beide funktionieren.

Zitat:

Zitat von Bernhard Geyer (Beitrag 1154266)
Lese mal die MSDN-Doku zu RemoveDirectory:

Zitat:

This path must specify an empty directory, ...
und dann auch noch das:

Zitat:

... recursively delete the files in a directory, use the SHFileOperation function.
:-)

Ich habe die Fragen gestellt, da die Funktion RemoveDirectory auch recursiv löscht, ohne die SHFileOperation Funktion zu nutzen. Nur braucht das Programm etwas über 4 Stunden um die Verzeichnisse zu löschen. Deshabl habe ich ja auch nach euerer Erfahrung gefragt, welche der beiden Funktionen Ihr einsetzt.

himitsu 3. Mär 2012 11:34

AW: Verzeichnis recursive übers Netzwerk löschen
 
Die 40 GB sind nicht sehr aussagefähig, auf dieses Problem bezogen.

Um wieviele Dateien und Verzeichnisse handelt es sich denn?

Eine 40 GB-Datei ist sehr schnell gelöscht, ein Verzeichnis mit 40.000 Dateien dauert schonmal länger und sind die 40.000 auch noch zu je einer Datei auf 40.000 Verzeichnisse verteilt, ist es übel.



Ein schnelles Netzwerk hilft auch ungemein (bzw. das Netzwerk sollte schneller sein, als der Datenträger)
und sind die Verzeichnisstrukturen (bei vielen Dateien und Verzeichnissen) schon in der Windows File Cache geladen, ist das auch nicht schlecht.

Bernhard Geyer 3. Mär 2012 11:42

AW: Verzeichnis recursive übers Netzwerk löschen
 
Zitat:

Zitat von RWarnecke (Beitrag 1154268)
Beide funktionieren.

Wie das wenn die Doku MSDN-Doku was anderes sagt? Ok. MSDN-Doku ist auch nicht fehlerhaft aber AFAIK haben wir das schon mal probiert und es ging nicht wenn das verzeichnis leer ist.

Zitat:

Zitat von RWarnecke (Beitrag 1154268)
:-)

Ich habe die Fragen gestellt, da die Funktion RemoveDirectory auch recursiv löscht, ohne die SHFileOperation Funktion zu nutzen. Nur braucht das Programm etwas über 4 Stunden um die Verzeichnisse zu löschen. Deshabl habe ich ja auch nach euerer Erfahrung gefragt, welche der beiden Funktionen Ihr einsetzt.[/QUOTE]

Selbst lesen wir die Dateien des Verzeichnisses ein und löschen sie per DeleteFile. Wie lange würde das in deinem Fall dauern.

Ist das entfernte Verzeichnis (neben der Frage von himitsu) auf einem Win-Server (Version) oder einem Linux-System? Wie lange dauert denn der SHFileOperation-Aufruf?

himitsu 3. Mär 2012 11:46

AW: Verzeichnis recursive übers Netzwerk löschen
 
@Bernhard Geyer:
Die Doku ist auf die Windows-Schnittstellen und den Dateisystemtreiber bezogen.
Beim Netzlaufwerk ist aber noch eine Schicht dazwischen und diese Schicht könnte zuzätzliche Funktionalitäten einführen, bzw. auf der anderen Seite befindet sich ein anderes Dateisystem oder gar ein anderes Betriebssystem.

RWarnecke 3. Mär 2012 11:58

AW: Verzeichnis recursive übers Netzwerk löschen
 
Es sind 7 Hauptverzeichnisse mit mehreren Unterverzeichnissen. Das größte Hauptverzeichnis liegt bei ca. 12 GB und das kleinste Hauptverzeichnis liegt bei ca. 15MB. Die Dateien sind alle unterschiedlich groß. Es gibt aber keine Datei die größer ist als 30MB.

Hier mal eine Aufstellung von den Verzeichnissen :
Code:
           Anzahl Dateien   Anzahl Verzeichnisse
1. Verzeichnis   11140           446
2. Verzeichnis   3099           531
3. Verzeichnis   132789           4767
4. Verzeichnis   176           21
5. Verzeichnis   3383           310
6. Verzeichnis   96735           10678
7. Verzeichnis   12979           2448
Gesamt           260301      19201

Zitat:

Zitat von Bernhard Geyer (Beitrag 1154273)
Ist das entfernte Verzeichnis (neben der Frage von himitsu) auf einem Win-Server (Version) oder einem Linux-System? Wie lange dauert denn der SHFileOperation-Aufruf?

Die Verzeichnisse liegen alle samt auf einem Linux-Server (Samba-Share).

Bernhard Geyer 3. Mär 2012 12:10

AW: Verzeichnis recursive übers Netzwerk löschen
 
Zitat:

Zitat von RWarnecke (Beitrag 1154277)
Die Verzeichnisse liegen alle samt auf einem Linux-Server (Samba-Share).

Kannst du einen Gegentest auf einem Windows-Server mit der gleichen Datei/Verzeichnisstruktur machen?
Die Samba-Implementierungen sind nach meinen Erfahrungen nicht unbedingt 100% Identisch vom Verhalten her wie die MS-Implementierung unter Windows.
Evtl. funktioniert ja das RemoveDirectory wegen entsprechender Samba-Konfiguration so langsam.

RWarnecke 3. Mär 2012 12:15

AW: Verzeichnis recursive übers Netzwerk löschen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1154278)
Kannst du einen Gegentest auf einem Windows-Server mit der gleichen Datei/Verzeichnisstruktur machen?

Nee kann ich nicht, da ich keinen Windows Server mit einem Hardware Raid5 habe. Wenn ich das auf einer normalen Platte auf einem Windows-Server teste glaube ich, dass das Ergebnis nicht aussagekräftig ist. Seit Ihr da anderer Meinung ?

Klaus01 3. Mär 2012 12:31

AW: Verzeichnis recursive übers Netzwerk löschen
 
Zitat:

Zitat von RWarnecke (Beitrag 1154277)
Die Verzeichnisse liegen alle samt auf einem Linux-Server (Samba-Share).

.. Shell Zugriff hast du nicht?

rm -rf ist recht fix

Grüße
Klaus

RWarnecke 3. Mär 2012 12:35

AW: Verzeichnis recursive übers Netzwerk löschen
 
Zitat:

Zitat von Klaus01 (Beitrag 1154281)
Zitat:

Zitat von RWarnecke (Beitrag 1154277)
Die Verzeichnisse liegen alle samt auf einem Linux-Server (Samba-Share).

.. Shell Zugriff hast du nicht?

Doch Shell-Zugriff habe ich.

Zitat:

Zitat von Klaus01 (Beitrag 1154281)
rm -rf ist recht fix

Den Befehl müsse ich dann jede Woche manuell ausführen, da es sich bei den zur Zeit 7 Verzeichnissen um Backupverzeichnisse handelt, wo jede Woche die ältesten Verzeichnisse gelöscht werden. Genau diese Backupverzeichnisse ermittelt das Programm und löscht diese dann auf dem Server.

Bernhard Geyer 3. Mär 2012 12:54

AW: Verzeichnis recursive übers Netzwerk löschen
 
Zitat:

Zitat von RWarnecke (Beitrag 1154279)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1154278)
Kannst du einen Gegentest auf einem Windows-Server mit der gleichen Datei/Verzeichnisstruktur machen?

Nee kann ich nicht, da ich keinen Windows Server mit einem Hardware Raid5 habe. Wenn ich das auf einer normalen Platte auf einem Windows-Server teste glaube ich, dass das Ergebnis nicht aussagekräftig ist. Seit Ihr da anderer Meinung ?

Und wieso hältst du uns solche relevanten Informationen vor? Was hätte es dir gebracht wenn ich gesagt hätte: 20.000 Dateien, 15 GB waren auf unserem Test-Server übers Netz in 10 Sekunden gelöscht. Dieser hat aber Win 2008 drauf und nur AFAIK nur ein RAID1.

Kannst du denn den Gegentest machen indem du die Dateien auf ein Nicht-RAID-Serverlaufwerk kopierst und dann dort löscht? Dann würde man schon mal sehen ob evtl. das RAID-5 bei den entsprechenden API-Aufrufen der Flaschenhals ist.

Auch ja: Für ein vollständiges Testszenario wäre auch noch die Linux und Samba-Version relevant und das eingesetzte Dateisystem. Wenn man "RemoveDirectory Samba" googled findet man viele Eintrag, aber primär von 2006. Es könnte also man was gegeben haben was hier problematisch ist.

RWarnecke 3. Mär 2012 13:18

AW: Verzeichnis recursive übers Netzwerk löschen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1154285)
Und wieso hältst du uns solche relevanten Informationen vor? Was hätte es dir gebracht wenn ich gesagt hätte: 20.000 Dateien, 15 GB waren auf unserem Test-Server übers Netz in 10 Sekunden gelöscht. Dieser hat aber Win 2008 drauf und nur AFAIK nur ein RAID1.

Ich habe nicht gewusst, dass das von Bedeutung ist. Sorry, dass ich das vorenthalten habe, war keine Absicht.:oops:

Zitat:

Zitat von Bernhard Geyer (Beitrag 1154285)
Kannst du denn den Gegentest machen indem du die Dateien auf ein Nicht-RAID-Serverlaufwerk kopierst und dann dort löscht? Dann würde man schon mal sehen ob evtl. das RAID-5 bei den entsprechenden API-Aufrufen der Flaschenhals ist.

Siehe unten bei dem Ergebnis meines Tests.

Zitat:

Zitat von Bernhard Geyer (Beitrag 1154285)
Auch ja: Für ein vollständiges Testszenario wäre auch noch die Linux und Samba-Version relevant und das eingesetzte Dateisystem. Wenn man "RemoveDirectory Samba" googled findet man viele Eintrag, aber primär von 2006. Es könnte also man was gegeben haben was hier problematisch ist.

Der Linux-Server ist eine Ubuntu 10.04.3 LTS mit Samba 3.4.7.

Ich habe ein paar Tests durchgeführt und folgendes ist dabei rausgekommen :
  • Bernhard hat Recht, der MSDN-Befehl RemoveDirectory löscht nur Verzeichnisse, die auch leer sind.
  • Ich hatte bei dem Vorgang letzte Nacht doch noch eine ältere Version von meinem Programm laufen, die mit DelDir gelöscht hat. :oops:
  • Als zweiten Test habe ich jetzt ein Verzeichnis in einer Größe von 722MB genommen und habe es auf den Linux-Server mit Samba-Share gespielt. Das Samba-Share liegt nicht auf dem Raid5. Das gleiche Verzeichnis auch noch auf einem Windows-Server 2008 ohne Raid5. Das Löschen auf beiden Server mit der Funktion DelDir von den Schweizern war gleich schnell.

Fazit:
Da der Windows-Server und der Linux-Server gleich schnell sind, liegt es aus meiner Sicht nicht an der Konfiguration des Samba-Shares. Um jetzt schneller die Backupverzeichnisse löschen zu können, habe ich im Moment nur eine Alternative, da ich nicht weiß ob es noch Optimierungsmöglichkeiten für die Funktion DelDir von den Schweizern gibt. Ich muss ein Bash-Skript von dem Programm erstellen lassen, welches die 7 Verzeichnisse löscht. Dieses Bash-Skript wird dann per Cron-Job aufgerufen.

Sorry, für die etwas chaotische Beschreibung.

Edit: Vom Mausklick zum Starten des Löschvorgangs bis zur Meldung hat der Linux- und Windows-Server 1 Minute und 6 Sekunden benötigt.

Valle 3. Mär 2012 13:50

AW: Verzeichnis recursive übers Netzwerk löschen
 
Zitat:

Zitat von RWarnecke (Beitrag 1154293)
Ich muss ein Bash-Skript von dem Programm erstellen lassen, welches die 7 Verzeichnisse löscht. Dieses Bash-Skript wird dann per Cron-Job aufgerufen.

Wieso denn Alternative? Ich hätte es von vornherein nicht anders gemacht.

Du schreibst einfach
Code:
4 0 * * 0 sambauser rm -rf /path/to/old/backup 2>/dev/null
in deine crontab und fertig. Löscht das Verzeichnis jeden Sonntag um 4 Uhr nachts und schickt dir Fehlermeldungen (wenn der Server richtig konfiguriert ist) per E-Mail.

Liebe Grüße,
Valentin

RWarnecke 3. Mär 2012 14:00

AW: Verzeichnis recursive übers Netzwerk löschen
 
Hallo Valle,

folgender Aufbau der Backupstruktur ist gegeben :

Code:
1.Verzeichnis
      |
      --- Backupverz. 1
      |
...
      |
      --- Backupverz. 25
      |
So ist jedes der 7 Verzeichnisse aufgebaut. Der Name des Backupverzeichnisses enthält das Datum. Dieses Datum wird von meinem Programm ausgelesen und in eine Liste geschrieben. Diese Liste wird dann abgearbeitet. Die Abarbeitung der Liste dauert die genannten 4 Stunden.

Zitat:

Zitat von Valle (Beitrag 1154297)
Du schreibst einfach
Code:
4 0 * * 0 sambauser rm -rf /path/to/old/backup 2>/dev/null
in deine crontab und fertig. Löscht das Verzeichnis jeden Sonntag um 4 Uhr nachts und schickt dir Fehlermeldungen (wenn der Server richtig konfiguriert ist) per E-Mail.

So einfach geht das nicht, da immer das älteste Datum ermittelt werden muss, welches sich im Verzeichnisnamen befindet. So benötige auf jedenfall ein Bash-Skript.

Valle 3. Mär 2012 14:25

AW: Verzeichnis recursive übers Netzwerk löschen
 
Achso, na dann schreibt man sich eben ein Script.

Es gäbe übrigens noch die Möglichkeit "find" mit Paramter "mtime" zu nutzen. So mache ich das immer.

Code:
find /path/to/backups -mindepth 2 -maxdepth 2 -type d -iname 'backupverz_*' -mtime +31 -exec rm -rf "{}" \;
Liebe Grüße,
Valentin


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:43 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