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