Veröffentlicht am :
Verwaltung INTERNE_ERZEUGUNG

Makro zur rekursiven Ordnerlöschung

Dieser Code ist auch verfügbar auf: English Español Français
Wartet auf Validierung
Attention : Dieser Code erfordert Administratorrechte.
Dieses Makro, `mp_deletefolder`, wurde entwickelt, um ein angegebenes Verzeichnis sowie dessen gesamten Inhalt (Dateien und Unterverzeichnisse) zu löschen. Es beginnt mit der Überprüfung der Gültigkeit des Ordnerpfads. Ist der Ordner gültig, wird ein anderes Makro (`%mp_dirlist`) verwendet, um eine rekursive Liste aller Elemente innerhalb des Ordners zu erhalten. Diese Liste wird dann nach absteigendem Level sortiert, um sicherzustellen, dass interne Elemente vor ihren Containern gelöscht werden. Der Stammordner wird explizit zur Löschliste hinzugefügt. Ein `DATA _NULL_` wird verwendet, um diese Liste zu durchlaufen und jede Datei und jeden Ordner mithilfe der Funktionen `filename()` und `fdelete()` zu löschen, mit einer rudimentären Fehlerbehandlung. Schließlich wird die temporäre Tabelle, die für die Ordnerliste verwendet wurde, gelöscht.
Datenanalyse

Type : INTERNE_ERZEUGUNG


Das Skript generiert eine temporäre Tabelle (`work.&tempds`) zur Speicherung der Liste der zu löschenden Datei- und Ordnerpfade. Diese Pfade werden durch Introspektion des Dateisystems über das Makro `mp_dirlist` ermittelt und nicht durch externe Geschäftsdaten oder die SASHELP-Bibliothek. Die Haupteingabe ist ein Dateisystempfad.

1 Codeblock
SAS-Makro
Erklärung :
Dieser Block initialisiert das Makro `mp_deletefolder`. Zuerst wird geprüft, ob der angegebene Pfad (`&folder`) ein gültiges und zugängliches Verzeichnis ist, mithilfe des Makros `%mf_isdir`. Ist dies der Fall, wird eine lokale Variable `tempds` deklariert und ihr ein eindeutiger Name zugewiesen, der von `%mf_getuniquename()` generiert wird, für eine temporäre Arbeitstabelle, die die Liste der zu löschenden Elemente speichert.
Kopiert!
1%macro mp_deletefolder(folder);
2 /* proceed if valid directory */
3 %IF %mf_isdir(&folder)=1 %THEN %DO;
4 /* prep temp table */
5 %local tempds;
6 %let tempds=%mf_getuniquename();
2 Codeblock
SAS-Makro (%mp_dirlist) Data
Erklärung :
Das Makro `%mp_dirlist` wird aufgerufen, um eine rekursive Liste aller Dateien und Unterordner zu generieren, die im durch `&folder` angegebenen Verzeichnis enthalten sind. Die Ergebnisse dieser Liste werden in der temporären Tabelle `work.&tempds` gespeichert, mit einer maximalen Suchtiefe (`maxdepth=MAX`).
Kopiert!
1/* recursive directory listing */
2%mp_dirlist(path=&folder,outds=work.&tempds, maxdepth=MAX)
3 Codeblock
PROC SORT
Erklärung :
Dieser `PROC SORT`-Schritt sortiert die temporäre Tabelle `work.&tempds` nach der Variablen `level` in absteigender Reihenfolge. Dies ist entscheidend, um sicherzustellen, dass die tiefsten Dateien und Unterordner (höheres Level) vor ihren übergeordneten Ordnern gelöscht werden, wodurch Fehler beim Löschen nicht leerer Ordner vermieden werden.
Kopiert!
1 /* sort descending level so can delete folder contents before folders */
2 PROC SORT DATA=work.&tempds;
3 BY descending level;
4 RUN;
4 Codeblock
PROC SQL
Erklärung :
Dieser `PROC SQL`-Block fügt den Pfad des Stammordners (`&folder`) explizit zur Tabelle `work.&tempds` hinzu. Dies gewährleistet, dass der ursprüngliche Ordner, sobald sein Inhalt geleert wurde, am Ende des Prozesses ebenfalls gelöscht wird.
Kopiert!
1/* ensure top level folder is removed at the end */
2 
3PROC SQL;
4insert into work.&tempds SET filepath="&folder";
5 
5 Codeblock
DATA STEP
Erklärung :
Dieser `DATA _NULL_` ist das Herzstück der Löschlogik. Er durchläuft jeden Datensatz der Tabelle `work.&tempds`. Für jeden `filepath` wird mit der Funktion `filename()` eine temporäre Dateireferenz (`fref`) zugewiesen, und dann wird versucht, die Datei oder den Ordner mit `fdelete()` zu löschen. Im Falle eines Fehlers (`rc` ungleich Null) wird eine Meldung im SAS-Log angezeigt. Die Dateireferenz wird anschließend freigegeben.
Kopiert!
1 /* delete everything */
2 DATA _null_;
3 SET work.&tempds END=last;
4 LENGTH fref $8;
5 fref='';
6 rc=filename(fref,filepath);
7 rc=fdelete(fref);
8 IF rc THEN DO;
9 msg=sysmsg();
10 put "&sysmacroname:" / rc= / msg= / filepath=;
11 END;
12 rc=filename(fref);
13 RUN;
6 Codeblock
PROC SQL
Erklärung :
Nach dem Löschen aller Elemente löscht dieser `PROC SQL`-Block die temporäre Tabelle `work.&tempds`, wodurch Ressourcen freigegeben und die Arbeitsumgebung bereinigt werden.
Kopiert!
1/* tidy up */
2 
3PROC SQL;
4drop TABLE work.&tempds;
5 
7 Codeblock
SAS-Makro
Erklärung :
Dieser Block enthält das Ende der bedingten Logik. Wenn der ursprüngliche Ordner nicht gültig oder zugänglich war (Bedingung des ursprünglichen `%if`), wird eine Fehlermeldung im SAS-Log angezeigt, die darauf hinweist, dass der angegebene Ordner ungültig ist. Schließlich markiert `%mend mp_deletefolder;` das Ende der Makrodefinition.
Kopiert!
1%END;
2%ELSE %put &sysmacroname: &folder: is not a valid / accessible folder. ;
3%mend mp_deletefolder;
4 
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : Copyright 2010-2023 HMS Analytical Software GmbH, http://www.analytical-software.de


Banner
Expertenrat
Expert
Simon
Expert SAS et fondateur.
« Das Makro mp_deletefolder folgt einer goldenen Regel der Dateisystemverwaltung: Ein Verzeichnis kann nur gelöscht werden, wenn es absolut leer ist. Die Intelligenz dieses Skripts liegt in der Verwendung einer absteigenden Sortierung nach Ebenen (descending level). Dieser "Bottom-Up"-Ansatz stellt sicher, dass "Blattknoten" (Dateien und tiefste Unterordner) zuerst gelöscht werden, bevor SAS versucht, die übergeordneten Container-Verzeichnisse zu entfernen. Dies verhindert die typischen "Directory not empty"-Fehler, die bei einer einfachen linearen Verarbeitung auftreten würden. »