Ordner-Löschen einmal anders

Stellen Sie sich bitte einmal die folgende Situation vor und bewahren Sie dabei die Nerven: Auf Ihrer Diskette befindet sich ein Ordner, der eine Unmenge von Dateien beinhaltet. Nun sollen diese Dateien aus dem Ordner entfernt und in das nächsthöhere Directory übertragen werden.

Wenn Sie genügend Zeit haben, können Sie folgendermaßen vorgehen: Sie öffnen den Ordner, kopieren alle Dateien einzeln und löschen anschließend den nun überflüssig gewordenen Ordner samt Inhalt. Dies kann aber je nach Anzahl der Dateien im Ordner recht lange dauern. Wenn Sie Pech haben, ist das Kopieren der Dateien jedoch aus Platzgründen nicht möglich. Schließlich befindet sich direkt nach dem Kopiervorgang jede Datei des Ordners zweimal auf der Disk, nämlich einmal im übergeordneten Directory und ein zweites Mal im betroffenen Ordner selbst. Die Diskette darf also nicht allzu voll sein. Leider ist dies oft der Fall, so daß einem nichts anderes übrigbleibt, als den Umweg über eine zweite Diskette oder über die RAM-Disk zu gehen, um alle Dateien zwischendurch irgendwo unterzubringen.

Doch dieser Ärger ist nun vorbei! Das Programm FOLDKILL ermöglicht es nämlich, alle Dateien in ein paar Sekunden aus einem Ordner zu entfernen und im übergeordneten Directory unterzubringen. Dies ist auch mit Disketten möglich, die bereits bis zum Rand voll sind, da keine Dateien umkopiert werden.

Die Bedienung des Programms ist denkbar einfach. Es ist als TTP-Programm konzipiert, dem als Parameter der komplette Pfad des zu entfernenden Ordners übergeben werden muß. (Achten Sie bitte darauf, den Backslash “\” am Beginn des Pfades einzugeben.) Ist das erste Zeichen des eingegebenen Pfades ein Blank, werden die Dateien des angesprochenen Ordners nicht in die nächsthöhere Ebene, sondern direkt ins Haupt-Directory verschoben.

Nun noch ein paar Worte zur Funktionsweise des Programms. Angelpunkt ist die RENAME-Funktion des GEMDOS, die nicht nur in der Lage ist, Dateien einfach umzubenennen, sondern auch ein Verschieben von Files ermöglicht. FOLDKILL sucht sich mit Hilfe der SFIRST-Funktion der Reihe nach alle Files im angegebenen Ordner. Durch RENAME-Aufrufe werden die Dateien in die nächsthöhere Directory-Ebene verschoben. Ist dies mit allen Dateien geschehen, wird der nun leere Ordner mit RMDIR entfernt, es sei denn, es befindet sich ein weiterer Ordner innerhalb der gleichen Ebene. Einzelheiten zum Programmablauf können dem kommentierten Quelltext entnommen werden, der mit einem zum AS68 kompatiblen Assembler assembliert worden ist. Die Programmlänge nach Assemblieren und Linken sollte 280 Bytes betragen, kann jedoch je nach verwendetem Assembler geringfügig von diesem Richtwert abweichen.

***************************
*        FOLDKILL         *
*   1988 by Uwe Seimet    *
* (c) MAXON Computer GmbH * 
***************************

*Konstanten für Aufrufe des Betriebssystems
GEMDOS   =  1
SETDTA   = $1A
RMDIR    = $3A
SETBLOCK = $4A
SFIRST   = $4E 
SNEXT    = $4F 
RENAME   = $56

         text

         move.l sp,a0 
         lea stack+400,sp 
         move.l 4(a0),a9
         lea $81(a0),a6    ;ergibt Pointer auf Kommandozeile
         move.l 12 (a0),a1 
         add.l 20(a0),a1 
         add.l 28(a0),a1 
         lea $100(a1),a1 
         move.l a1,-(sp) 
         move.l a0,-(sp) 
         clr -(sp)
         move #SETBLOCK,-(sp)
         trap #GEMDOS      ;nicht benötigten Speicher freigeben
         lea 12(sp),sp
         lea newnam,a5     ;Pointer auf neuen Dateinamen 
         move.l a6,a0      ;Pointer auf Namen des Ordners 
         cmp.b #' ',(a6)   ;ins Haupt-Directory verschieben? 
         bne.s loop0       ;nein-
         addq.l #1,a0      ;Blank überspringen
loop0:   move.b (a0),(a5)  ;Pfadnamen kopieren
         beq.s concat      ;Ende des Namens-
         cmp.b #$0d,(a0)   ;Zeilenende?
         beq.s concat      ;ja-
         addq.l #1,a0 
         addq.l #1,a5 
         bra loop0 
concat:  move.b #'\',(a0)+
         move.l a0,a4      ;Pointer auf Extension merken
         move.b #'*',(a0)+ ;Joker anhängen
         move.b #'.',(a0)+ 
         move.b #'*',(a0)+ 
         clr.b (a0)
         cmp.b #' ',(a6)   ;ins Haupt-Directory verschieben? 
         bne.s loop1       ;nein-
         addq.l #1,a6 
         lea newnam,a5 
         bra.s cont
loop1:   cmp.l #newnam,a5  ;Dateien ins Haupt-Directory verschieben? 
         beq.s cont        ;ja-
         cmp.b #'\',-(a5)  ;Pfad der nächsthöheren Ebene suchen
         bne loop1 
cont:    move.b #'\',(a5)+
         clr.b (a5) 
         pea dta
         move #SETDTA,-(sp) 
         trap #GEMDOS
         addq.l #6,sp
         move #7,-(sp)  ;nach allen Dateien des Ordners suchen
         move.l a6,-(sp) 
         move #SFIRST,-(sp) 
         trap #GEMDOS 
         addq.l #8,sp 
         bra.s move 
loop:    move #SNEXT,-(sp)
         trap #GEMDOS 
         addq.l #2,sp 
move:    tst.l d0       ;noch Dateien vorhanden?
         bne.s folddel  ;nein-
         move.l a5,a0
         lea dta+30,a1  ;Pointer auf gefundenen Dateinamen
copy1:   move.b (a1)+,(a0)+ ;ergibt kompletten neuen Dateinamen
         bne copy1 
         move.l a4,a0 
         lea dta+30,a1 
copy2:   move.b (a1)+,(a0)+ ;ergibt kompletten alten Dateinamen
         bne copy2
         pea newnam         ;neuer Name
         move.l a6,-(sp)    ;alter Name
         clr -(sp)
         move #RENAME,-(sp)
         trap #GEMDOS       ;Datei verschieben
         lea 12(sp),sp 
         bra loop 
folddel: clr.b -(a4)
         move.l a6,-(sp) 
         move #RMDIR,-(sp)
         trap #GEMDOS       ;leeren Ordner löschen
         addq.l #6,sp 
quit:    clr -(sp)
         trap #GEMDOS       ;das war's


         bss

dta:     ds.b 44

newnam:  ds.b 81           ;neue Dateinamen

         even

stack:   ds.l 100          ;für Stack

Uwe Seimet
Aus: ST-Computer 12 / 1989, Seite 80

Links

Copyright-Bestimmungen: siehe Über diese Seite