home *** CD-ROM | disk | FTP | other *** search
- /*********************************************************/
- /* XDEL.C */
- /* Version 1.21 */
- /* (C) 1991 Hubert Hopf & DMV-Verlag */
- /* Erweiterte DOS-Löschfunktionen äquivalent zu XCOPY */
- /*********************************************************/
-
-
- #include <dir.h>
- #include <dos.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <ctype.h>
- #include <stdarg.h>
-
- /* Definitionen */
-
- #define M_REP 0x0002 /* Meldung in Report */
- #define M_PRT 0x0001 /* Meldung nach stdout */
-
- /* Definitionen für Meldungen (Messages) */
-
- #define MSG_DD 0 /* delete directory */
- #define MSG_DF 1 /* delete file */
- #define MSG_UD 2 /* up-directory */
- #define MSG_SD 3 /* sub-directory */
- #define MSG_DRO 4 /* direct. is read only */
- #define MSG_FRO 5 /* file is read only */
- #define MSG_EUD 6 /* error chg. up-dir */
- #define MSG_ESD 7 /* error chg. sub-dir */
- #define MSG_FROND 8 /* rd. only-file not del*/
- #define MSG_FLM 9 /* files last message */
- #define MSG_DLM 10 /* dir. last message */
- #define MSG_FER 11 /* error open report */
- #define MSG_NOD 12 /* not deleted */
- #define MSG_NF 13 /* no files or dirs */
- #define MSG_BRK 14 /* break with escape */
- #define MSG_FNOF 15 /* filenames overflow */
-
- #define Error(text) { printf("\n%s\n\n",text); exit(1); }
-
-
- /* Hilfetexte zu den verschiedenen Optionen */
-
- /* Hilfe zur Option /h (Hilfe) */
- char *hhelp[] =
- {
- "Die Option /hx gibt eine ausführliche Hilfe zu der "
- "angegebenen Option aus.\n",
- "Beispiel: XDEL /hs gibt eine ausführliche Hilfe "
- "zu der Option /s \n",
- " (Unterverz. löschen) aus.\n",
- "Es sind sonst keine Aktionen möglich, XDEL bricht "
- "nach der Ausgabe der\n",
- "Hilfe ab, es können aber mehrere /h-Optionen "
- "hintereinander angegeben werden.\n",
- "Beispiel: XDEL /hs /ha /hnm ... \n",
- " XDEL gibt dann Hilfen zu allen "
- "angegebenen Optionen.\n",
- NULL
- };
-
- /* Hilfe zur Option /a bzw. /na (Abfrage) */
- char *ahelp[] =
- {
- "Die Optionen /a bzw. /na schalten die "
- "Sicherheitsabfragen an oder aus\n",
- "(in drei Stufen).\n",
- "Diese Abfragen müssen mit 'j' oder 'J' für Ja bzw. 'y' "
- "oder 'Y' für Yes\n",
- "bestätigt werden, wenn die abgefragte Datei bzw. das "
- "Verzeichnis gelöscht\n",
- "werden soll, oder mit jedem anderen beliebigen Zeichen,"
- " wenn die Datei oder\n",
- "das Verzeichnis nicht gelöscht werden soll.\n",
- "Standard: (ohne /a bzw. /na) Es wird vor der Löschung "
- "von Verzeichnissen\n",
- " oder schreibgeschützten Dateien eine "
- "Sicherheitsabfrage \n",
- " durchgeführt.\n",
- "/a Es wird bei jeder Datei oder bei jedem "
- "Verzeichnis abgefragt.\n",
- "/na Es wird nicht abgefragt, auch nicht bei "
- "Verzeichnissen.\n",
- " Ausnahme: schreibgeschützte Dateien werden "
- "auch hier vor der\n",
- " Löschung abgefragt.\n",
- NULL
- };
-
- /* Hilfe zur Option /r (Report) */
- char *rhelp[] =
- {
- "Die Option /r[File] startet einen Report (Protokoll) "
- "über alle Lösch-\n",
- "vorgänge und schreibt sie auf die Standardausgabe bzw. "
- "wenn eine Datei\n",
- "angegeben wurde in diese Datei. \n",
- "Dieses Protokoll beinhaltet außer den normalen Angaben "
- "und Meldungen\n",
- "Meldungen über Name und Größe jeder gelöschten Datei.\n",
- "Beispiel: XDEL /rLOESCH.REP *.* schreibt alle "
- "Informationen in die\n",
- " Datei LOESCH.REP.\n",
- "Achtung !!! Die Report-Datei darf nicht dem Suchmuster"
- " entsprechen,\n",
- " da sie sonst auch gelöscht wird. Abhilfe: "
- "Die Report-Datei\n",
- " über Pfad-Angabe in ein anderes "
- "Verzeichnis legen.\n",
- " Beispiel: XDEL /rC:\\REPORTS\\LOESCH.REP "
- "*.*\n",
- NULL
- };
-
- /* Hilfe zur Option /s (Subdirectories, Unterverz.) */
- char *shelp[] =
- {
- "Die Option /s erlaubt es, Unterverzeichnisse eines "
- "angegebenen \n",
- "Verzeichnisses mit dem kompletten Inhalt zu löschen.\n",
- "Achtung !! Die Wirkung ist wie ein DEL *.* in diesem "
- "Verzeichnis\n",
- "und anschließendem RMDIR des Verzeichnisses. \n",
- "Je nach Option /(n)a wird vorher eine "
- "Sicherheitsabfrage \n",
- "durchgeführt (siehe dort).\n",
- "Verweis auf Option /m: Löschen bestimmter Dateien in "
- "allen \n",
- " Unterverzeichnissen.\n",
- NULL
- };
-
- /* Hilfe zur Option /nm (No message, keine Meldungen) */
- char *nhelp[] =
- {
- "Die Option /nm[x] erlaubt es, den Löschvorgang ohne "
- "Meldungen und\n",
- "Sicherheitsabfragen zu durchlaufen. Es kann dabei "
- "eine Standard-\n",
- "Antwort für die Sicherheitsabfragen vorgegeben "
- "werden.\n",
- "Wird keine Standard-Antwort vorgegeben, ist 'Nein' "
- "der Standard,\n",
- "d.h. es wird bei Abfragen nicht gelöscht.\n",
- "Beispiel: XDEL /nm *.* Löscht alle Dateien ohne "
- "Meldungen,\n",
- " Wird eine Sicherheitsabfrage "
- "ausgegeben\n",
- " (z. B. bei schreibgeschützten "
- "Dateien), \n",
- " so wird diese Datei nicht "
- "gelöscht.\n",
- " entspricht XDEL /nmn *.*\n",
- " XDEL /nmj *.* Wie oben, jedoch werden jetzt "
- "die Dateien,\n",
- " bei denen eine Abfrage erfolgt,"
- " auch gelöscht.\n",
- " XDEL /s /nmj *.* Löscht alle Dateien und "
- "Unterverzeichnisse\n",
- " ohne (!!) vorherige Abfrage.\n",
- "FATAL !!: XDEL /s /nmj C:\\*.* Löscht die ganze "
- "Festplatte ohne Abfrage.\n",
- "Deshalb: Vorsicht beim Umgang mit dieser Option, nur "
- "dann einsetzen, wenn\n",
- " es auch wirklich nötig ist, und man sicher "
- "ist, daß nichts \n",
- " Falsches gelöscht wird.\n",
- "Diese Option ist vor allem für den Betrieb in BATCH-"
- "Dateien gedacht.\n",
- NULL
- };
-
- /* Hilfe zur Option /m (Matchcode, passende Files) */
- char *mhelp[] =
- {
- "Die Option /m bewirkt, daß sämtliche Unterverzeichnisse"
- " nach passenden\n",
- "Dateien durchsucht und diese gelöscht werden. Dabei "
- "werden gleichnamige\n",
- "Unterverzeichnisse nicht gelöscht.\n",
- "Beispiel: XDEL /m *.bak Löscht alle Dateien, die als "
- "Endung .BAK haben\n",
- " im aktuellen und allen "
- "Unterverzeichnissen.\n",
- "Die Option /s (Unterverzeichnisse mit Inhalt löschen) "
- "hat bei aktivierter\n",
- "/m-Option keine Wirkung.\n",
- NULL
- };
-
- /* Hilfe zur Option /i (Info) */
- char *ihelp[] =
- {
- "Die Option /i bewirkt die Ausgabe von ausführlicher "
- "Information während\n",
- "des Löschvorganges. Die Informationen werden auf den "
- "Bildschirm ausgegeben.\n",
- "Der Umfang der Informationen entspricht den mit /r in "
- "eine Report-Datei\n",
- "ausgegebene Information.\n",
- NULL
- };
-
- /* Hilfe zur Option /d ((not) delete) */
- char *dhelp[] =
- {
- "Die Option /d bewirkt, daß die im Pfad angegebenen "
- "Dateien gesucht\n",
- "werden und (je nach Option /i) auch Meldungen "
- "ausgegeben werden,\n",
- "aber die Dateien werden nicht tatsächlich gelöscht.\n",
- "Diese Option kann dazu dienen, alle Dateien oder "
- "Verzeichnisse, die \n",
- "auf das angegebene Suchmuster im Pfad passen würden, "
- "zu suchen.\n",
- "Die Wirkung ist ähnlich einem FIND-Befehl.\n",
- NULL
- };
-
- /* Hilfe zur Option /e (Exclude, Ausschließlich) */
- char *ehelp[] =
- {
- "Die Option /e bewirkt, daß alle Dateien, die nach "
- "dieser Option aufgeführt\n",
- "sind, vom Löschvorgang ausgeschlossen sind. \n",
- "Beispiel: XDEL prog.* /e *.exe *.com Löscht im "
- "aktuellen Verzeichnis alle\n",
- " Dateien, die "
- "mit PROG beginnen, außer\n",
- " PROG.COM und "
- "PROG.EXE.\n",
- " XDEL /e *.exe *.com Löscht im "
- "aktuellen Verzeichnis alle\n",
- " Dateien, außer "
- "COM- oder EXE-Dateien.\n",
- "Beim Aufruf von XDEL ist die Reihenfolge der "
- "angegebenen Dateien zu\n",
- "beachten, da alle vor /e angegebenen Dateien gelöscht "
- "und alle nach /e \n",
- "angegebenen Dateien vom Löschvorgang ausgeschlossen "
- "werden. \n",
- "Wird die Angabe der Dateien vor /e weggelassen, so "
- "werden alle (*.*) Dateien\n",
- "angenommen (siehe zweites Beispiel oben).\n",
- "Die Angabe der Exclude-Dateien sollte ohne Pfadangabe "
- "erfolgen, da sonst kein \n",
- "korrekter Vergleich erfolgen kann.\n",
- NULL
- };
-
- /* Meldungen, die mit mess() aufgerufen werden */
-
- char *msg[] =
- {
- "Verzeichnis %-15s gelöscht\n",
- "Datei %-15s mit %8ld Bytes gelöscht\n",
- "Pfad: .. <---\n",
- "Pfad: ---> %-15s\n",
- "Verzeichnis %-15s ist schreibgeschützt !\n",
- "Datei %-15s war schreibgeschützt !\n",
- "Fehler beim Wechsel in Vaterverzeichnis !! \n"
- "Abbruch !!!\n",
- "Fehler beim Wechsel in Verzeichnis %s !! \n"
- "Abbruch !!!\n",
- "Datei %-15s ist schreibgeschützt und "
- "wurde nicht gelöscht !\n",
- "%d Dateien mit insgesamt %ld Bytes gelöscht !\n",
- "%d Verzeichnisse gelöscht !\n",
- "Konnte Report-Datei %s nicht öffnen, \n"
- "Report-Ausgabe erfolgt auf die Standard-Ausgabe !\n",
- "Angezeigte Dateien und Verzeichnisse wurden nicht (!) "
- "gelöscht\n",
- "Keine Datei oder Verzeichnis gefunden !\n",
- "Löschvorgang wurde durch ESC abgebrochen !\n",
- "Zu viele Filenamen als Parameter angegeben (max. 16)!\n"
- };
-
- FILE *output = stdout; /* File-Pointer für Report-File */
- int argcnt = 0, eargcnt = 0, subdirs = 0, subcount = 0;
- int message = 1, reports = 0, help = 0, matchdel = 0;
- int exclude = 0, nodel = 0, info = 0, ask = 1, endxdel = 0;
- int anzf = 0, anzd = 0;
- int answer = 'n'; /* Standard-Antwort bei Abfragen */
- long bytes = 0L;
-
- /* char-Pointer (Strings) für Filenamen und Pfade */
- char *name, repfile[MAXPATH];
- char drive[MAXDRIVE], dir[MAXDIR], files[MAXFILE];
- char ext[MAXEXT], fullpath[MAXPATH], oldpath[MAXPATH];
- char aktpath[MAXPATH], *argums[16], *eargums[16];
-
- int splitflags; /* Flags für fnsplit() */
-
- /* Attribute der zu suchenden Files und Directories */
- int fattrib = FA_RDONLY | FA_HIDDEN | FA_DIREC;
-
-
- /*********************************************************/
- /* */
- /* Funktion: void PrtHlp(char *htxt[]) */
- /* */
- /* Beschr. : Diese Funktion gibt die Hilfetexte für die */
- /* verschiedenen Optionen aus. Nach der Aus- */
- /* gabe wartet die Fkt. auf einen Tastendruck.*/
- /* */
- /* Übergabe: char *htxt[] */
- /* Array mit char-Pointern, die die Hilfetexte*/
- /* enthalten. Das Ende des Arrays wird durch */
- /* einen NULL-Pointer gekennzeichnet. */
- /* */
- /*********************************************************/
-
- void PrtHlp(char *htxt[])
- {
- int i;
- printf("\n");
- for (i = 0; htxt[i] != NULL; i ++) printf(htxt[i]);
- printf("\nWeiter mit beliebiger Taste\n\n");
- getch();
- }
-
-
- /*********************************************************/
- /* */
- /* Funktion: void mess(int mode, char *msg, ...) */
- /* */
- /* Beschr. : Diese Funktion gibt eine Meldung auf den */
- /* Bildschirm oder in eine Datei (Report) aus.*/
- /* Die Meldungen werden i.d.R. mit Hilfe der */
- /* msg-Texte übergeben. */
- /* */
- /* Übergabe: int mode */
- /* Gibt an, wohin die Meldung ausgegeben */
- /* werden soll. */
- /* mode = M_REP Ausgabe in Report */
- /* mode = M_PRT Ausgabe in stdout */
- /* Die Modi können auch OR-verknüpft werden. */
- /* */
- /* char *msg */
- /* Auszugebende Nachricht mit Formatangaben */
- /* wie bei printf(). */
- /* */
- /* ... */
- /* Variable Paramterliste wie bei printf(), um*/
- /* für Formatangaben in msg Werte zu liefern. */
- /* */
- /*********************************************************/
-
- void mess(int mode, char *msg,...)
- {
- va_list argptr;
- char buffer[128];
-
- /* Variable Parameterliste auswerten */
- va_start(argptr,msg);
- vsprintf(buffer,msg,argptr);
- va_end(argptr);
-
- /* Nachricht auf Bildschirm oder in Report ausgeben */
- if ((message && (mode & M_PRT)) || info) printf(buffer);
- if (reports && (mode & M_REP)) fprintf(output,buffer);
- }
-
-
- /*********************************************************/
- /* */
- /* Funktion: int delfiles(struct ffblk *fblk) */
- /* */
- /* Beschr. : Diese Funktion löscht Files oder Direct. */
- /* mit Hilfe der DOS-Funktion 3Ah (Direct.) */
- /* bzw. 41h (Files). Nach dem Löschvorgang */
- /* wird die Anzahl der gelöschten Files bzw. */
- /* Directories hochgezählt und die gelöschten */
- /* Bytes addiert. */
- /* */
- /* Übergabe: struct ffblk *fblk */
- /* Struktur von DOS, die von den DOS-Funktion */
- /* findfirst() und findnext() geliefert wird. */
- /* Diese Struktur beinhaltet auch den File- */
- /* namen und die Fileattribute. */
- /* */
- /*********************************************************/
-
- int delfiles(struct ffblk *fblk)
- {
- union REGS r;
- struct SREGS s;
-
- /* Löschen eingeschaltet (nicht aktive Option /d) */
- /* dann löschen. */
- if (nodel == 0)
- {
- if (fblk->ff_attrib & FA_DIREC) r.h.ah = 0x3A;
- else r.h.ah = 0x41;
- s.ds = _DS; /* direkt Datensegment zuweisen */
- r.x.dx = FP_OFF(&fblk->ff_name);
- intdosx(&r,&r,&s);
- if (r.x.cflag) return(r.x.ax); /* Fehler ? */
- }
- /* Anzahl erhöhen und Meldung ausgeben */
- if (fblk->ff_attrib & FA_DIREC)
- {
- anzd ++;
- mess(M_REP,msg[MSG_DD],fblk->ff_name);
- }
- else
- {
- anzf ++;
- bytes += (long)fblk->ff_fsize;
- mess(M_REP,msg[MSG_DF],fblk->ff_name,fblk->ff_fsize);
- }
- return(0);
- }
-
- /*********************************************************/
- /* */
- /* Funktion: void xdelhelp(void) */
- /* */
- /* Beschr. : Gibt eine Kurzinformation über den */
- /* Aufruf und die Parameter von XDEL. */
- /* */
- /*********************************************************/
-
- void xdelhelp(void)
- {
- printf("\nAufruf: XDEL [/hx /a /na /nmx /s /m /i /d /r["
- "File]] File [File ...] /e Files ...\n");
- printf(" /hxx = Ausführliche Hilfe zu der ansc"
- "hließend angegebenen Option\n");
- printf(" /a = Mit Abfrage (Dateien und Verze"
- "ichnisse)\n");
- printf(" /na = keine Abfrage \n");
- printf(" Standard: Abfrage nur bei Verz"
- "eichnissen\n");
- printf(" und schreibgeschützt"
- "en Dateien\n");
- printf(" /nmx = Keine Nachrichten\n");
- printf(" x = Standard-Antwort bei Sicherhei"
- "tsabfragen\n");
- printf(" x = 'j' Bei Abfrage löschen\n");
- printf(" x = 'n' Bei Abfr. nicht löschen\n");
- printf(" /s = Auch Unterverzeichnisse lösche"
- "n (mit komplettem Inhalt)\n");
- printf(" /m = bestimmte Dateien im aktuellen"
- " und allen Unterverzeichnissen\n");
- printf(" löschen. Verzeichnisse werden "
- "nicht gelöscht !\n");
- printf(" /i = Voll-Info nach Beendigung\n");
- printf(" /e = Es werden alle Dateien außer d"
- "ie angegebenen gelöscht\n");
- printf(" /d = nicht löschen, nur anzeigen ! "
- "\n");
- printf(" /r[file] = Report auf Bildschirm oder"
- " in Datei\n");
- printf(" Filename auch mit Wildcards (Jokerzeichen"
- ") möglich\n");
- printf(" Abbruch des Löschvorganges mit ESC möglic"
- "h\n\n");
- exit(1);
- }
-
- /*********************************************************/
- /* */
- /* Funktion: int setattribute(char *name) */
- /* */
- /* Beschr. : Löscht das Read-Only-Attribut des übergeb- */
- /* enen Files. DOS-Fkt INT 21h, Fkt 43h */
- /* */
- /* Übergabe: char *name */
- /* Name des Files, dessen RO-Attribut */
- /* gelöscht werden soll. */
- /* */
- /* Rückgabe: Fehlercode des Interrupt-Aufrufes */
- /* */
- /*********************************************************/
-
- int setattribute(char *name)
- {
- union REGS r;
- struct SREGS s;
- char *pfad;
- int ret;
-
- pfad = (char *)malloc(128);
-
- /* Zuerst kompletten Filenamen mit Pfadangabe */
- strcpy(pfad," :\\");
- pfad[0] = 'A' + getdisk();
- getcurdir(0,pfad+3);
- strcat(pfad,"\\");
- strcat(pfad,name);
-
- r.x.ax = 0x4300;
- s.ds = _DS;
- r.x.dx = FP_OFF(pfad);
- intdosx(&r,&r,&s); /* Attribute holen */
- ret = r.x.ax;
- if (r.x.cflag) /* Fehler ? */
- {
- free(pfad);
- return(ret); /* Dann beenden */
- }
- r.x.cx &= 0xFFFE; /* sonst RO-Attribut löschen */
- r.x.ax = 0x4301;
- intdosx(&r,&r,&s);
- if (r.x.cflag) ret = r.x.ax;
- else ret = 0;
- free(pfad);
- return(ret);
- }
-
- /*********************************************************/
- /* */
- /* Funktion: int askdel(char *name, int mode) */
- /* */
- /* Beschr. : Fragt nach, ob ein File oder Directory */
- /* gelöscht werden soll. */
- /* */
- /* Übergabe: char *name */
- /* Name des Files oder Directories, das */
- /* gelöscht werden soll. */
- /* */
- /* int mode */
- /* mode = 0 Es handelt sich um ein Directory */
- /* mode = 1 Es handelt sich um ein File */
- /* */
- /* Rückgabe: 0 Abfrage wurde mit Nein beantwortet */
- /* 1 Abfrage wurde mit Ja beantwortet */
- /* */
- /*********************************************************/
-
- int askdel(char *name, int mode)
- {
- int cc;
-
- if (message == 1) /* Es soll gefragt werden */
- {
- if (ask == 2 || (ask == 1 && mode == 0))
- {
- if (mode) printf("Datei %s löschen (J/N) ",name);
- else printf("Verzeichnis %s löschen (J/N) ",name);
-
- cc = tolower(getch());
- printf("%c\n",cc);
- if (cc == 'j' || cc == 'y') return(1);
- else return(0);
- }
- }
- /* Es soll nicht gefragt werden: Gibt Wahr zurück, */
- /* wenn die Standard-Antwort (aus Option /nm) Ja ist. */
- else return(answer == 'j');
-
- return(1); /* wird nie erreicht, für Compilerwarnung */
- }
-
- /*********************************************************/
- /* */
- /* Funktion: int checkexclude(char *name) */
- /* */
- /* Beschr. : Prüft, ob das angegebene File vom Lösch- */
- /* vorgang ausgeschlossen sein soll (Opt. /e).*/
- /* Der Name sollte ohne Pfadangabe sein, da */
- /* jedes Directory überprüft wird. */
- /* */
- /* Übergabe: char *name */
- /* Filename, der überprüft werden soll. */
- /* */
- /* Rückgabe: 1 wenn File ausgeschl. wird, sonst 0. */
- /* */
- /*********************************************************/
-
- int checkexclude(char *name)
- {
- int i;
- int ret;
- struct ffblk eblk;
-
- if (exclude) /* Option eingeschaltet ? */
- {
- strupr(name);
-
- for (i = 0; i < eargcnt; i ++)
- {
- ret = findfirst(eargums[i],&eblk,fattrib);
- while (ret == 0) /* Exclude-File gefunden ? */
- {
- /* stimmt überein ? */
- if (strcmp(eblk.ff_name,name) == 0) return(1);
- ret = findnext(&eblk); /* Weitersuchen */
- }
- }
- }
- return(0); /* hat nicht übereingestimmt */
- }
-
- /*********************************************************/
- /* */
- /* Funktion: int delfunkt(char *name) */
- /* */
- /* Beschr. : Löscht alle Dateien und evtl. Verzeichnisse*/
- /* die auf name passen. */
- /* */
- /* Übergabe: char *name */
- /* File- oder Directoryname (auch Wildcards), */
- /* der gelöscht werden soll. */
- /* */
- /*********************************************************/
-
- int delfunkt(char *name)
- {
- int ret = 0;
- int cc;
- struct ffblk fblk;
-
- ret = findfirst(name,&fblk,fattrib);
- if (ret == 0)
- {
- do
- {
- if (kbhit())
- if (getch() == 27) { endxdel = 1; break; }
- if (ret != 0)
- {
- if (chdir("..") == 0)
- {
- mess(M_REP,msg[MSG_UD]);
- subcount --;
- break;
- }
- else
- {
- mess(M_REP,msg[MSG_EUD]);
- Error("Fehler beim Wechsel in Vaterverzeichnis ! \n");
- }
- }
- else
- {
- if ((fblk.ff_attrib & FA_DIREC) && subdirs &&
- (strncmp(fblk.ff_name,".",1) != 0))
- {
- if ((fblk.ff_attrib & FA_RDONLY) != 0)
- mess(M_REP,msg[MSG_DRO],fblk.ff_name);
- else
- {
- if (askdel(fblk.ff_name,0))
- {
- if (chdir(fblk.ff_name) == 0)
- {
- mess(M_REP,msg[MSG_SD],fblk.ff_name);
- subcount ++;
- delfunkt("*.*");
- if (endxdel) break;
- delfiles(&fblk);
- }
- else
- {
- mess(M_REP,msg[MSG_ESD],fblk.ff_name);
- Error("Fehler beim Wechsel in nächstes Verzeichnis !");
- }
- }
- }
- }
- else
- {
- if ((fblk.ff_attrib & FA_DIREC) == 0 &&
- (!checkexclude(fblk.ff_name)))
- {
- if ((fblk.ff_attrib & FA_RDONLY) != 0)
- {
- if (message)
- {
- printf("Datei %s ist schreibgeschützt ! "
- " Trotzdem löschen (J/N) ? ",
- fblk.ff_name);
- printf("%c\n",cc = tolower(getch()));
- }
- else cc = answer;
- if (cc == 'j' || cc == 'y')
- {
- setattribute(fblk.ff_name);
- if (delfiles(&fblk) == 0)
- mess(M_REP,msg[MSG_FRO],fblk.ff_name);
- }
- else
- mess(M_REP,msg[MSG_FROND],fblk.ff_name);
- }
- else
- if (askdel(fblk.ff_name,1)) delfiles(&fblk);
- }
- }
- }
- }
- while (((ret = findnext(&fblk)) == 0 || (subcount && subdirs)) &&
- !endxdel);
- }
- else
- if (!matchdel) mess(M_REP | M_PRT,msg[MSG_NF]);
- return (0);
- }
-
- /*********************************************************/
- /* */
- /* Funktion: int delmatches(char *name) */
- /* */
- /* Beschr. : Löscht alle Files, die auf name passen. */
- /* Löscht auch alle passenden Files in Unter- */
- /* verzeichnissen, aber nicht d. Verz. selbst.*/
- /* */
- /* Übergabe: char *name */
- /* Filename (auch Wildcards) der gelöscht */
- /* werden soll. */
- /* */
- /*********************************************************/
-
- int delmatches(char *name)
- {
- int ret = 0;
- struct ffblk mblk;
-
- subdirs = 0; /* In delfunkt() keine Unterverz. suchen */
-
- delfunkt(name); /* Zuerst alle passenden Files löschen */
-
- /* dann alle Unterverzeichnisse durchsuchen */
- ret = findfirst("*.*",&mblk,FA_DIREC);
- do
- {
- if (ret != 0)
- {
- if (!subcount) break;
- if (chdir("..") == 0)
- {
- mess(M_REP,msg[MSG_UD]);
- subcount --;
- break;
- }
- else
- {
- mess(M_REP,msg[MSG_EUD]);
- Error("Fehler beim Wechsel in Vaterverzeichnis ! \n");
- }
- }
- else
- {
- if ((mblk.ff_attrib & FA_DIREC) && /* Directory ? */
- (strncmp(mblk.ff_name,".",1) != 0))
- {
- if (chdir(mblk.ff_name) == 0) /* dann wechseln */
- {
- mess(M_REP,msg[MSG_SD],mblk.ff_name);
- subcount ++;
- delmatches(name);
- if (endxdel) break;
- }
- else
- {
- mess(M_REP,msg[MSG_ESD],mblk.ff_name);
- Error("Fehler beim Wechsel in "\
- "nächstes Verzeichnis !");
- }
- }
- }
- }
- while ((ret = findnext(&mblk)) == 0 || subcount);
- return(0);
- }
-
- /*********************************************************/
- /* */
- /* Funktion: int main(int argc, char *argv[]) */
- /* */
- /* Beschr. : Hauptfunktion, liest Parameter ein und */
- /* ruft je nach Option /m delfunkt() oder */
- /* delmatches() auf. Gibt abschließende */
- /* Meldungen aus. */
- /* */
- /* Übergabe: int argc, char *argv[] */
- /* Anzahl und Text der übergebenen Parameter */
- /* Optionen und Filenamen */
- /* */
- /* Rückgabe: 0 wenn erfolgreich */
- /* ESC (27) bei Abbruch mit ESC */
- /* */
- /*********************************************************/
-
- int main(int argc, char *argv[])
- {
- int i;
- char hc;
- name = NULL;
-
- printf("XDEL V. 1.21 (C) 1991 H. Hopf & DMV-Verlag\n");
- if (argc < 2) xdelhelp(); /* keine Parameter */
-
-
- for (i = 1; i < argc; i ++) /* Param. einlesen */
- {
- if (strncmp(argv[i],"/",1) == 0) /* Par. od. File */
- {
- strlwr(argv[i]);
- if (strncmp(argv[i],"/nm",3) == 0)
- {
- message = 0;
- if (strlen(argv[i]) > 3)
- {
- answer = argv[i][3]; /* Antwort für /nm setzen */
- if (answer != 'j' && answer != 'y') answer = 'n';
- }
- }
- if (strncmp(argv[i],"/s",2) == 0) subdirs = 1;
- if (strncmp(argv[i],"/m",2) == 0) matchdel = 1;
- if (strncmp(argv[i],"/i",2) == 0) info = 1;
- if (strncmp(argv[i],"/a",2) == 0) ask = 2;
- if (strncmp(argv[i],"/na",3) == 0) ask = 0;
- if (strncmp(argv[i],"/d",2) == 0) nodel = 1;
- if (strncmp(argv[i],"/e",2) == 0) exclude = 1;
- if ((strncmp(argv[i],"/h",2) == 0) ||
- (strncmp(argv[i],"/?",2) == 0))
- {
- help = 1; hc = 'h'; /* Hilfe-Option gesetzt */
- if (strlen(argv[i])>2)
- {
- if (strchr("samiedrn",argv[i][2]) != NULL)
- hc = argv[i][2];
- if (argv[i][2] == 'n')
- if (strlen(argv[i]) > 3 && argv[i][3] == 'a')
- hc = 'a';
- }
- switch (hc) /* entsprechende Hilfe aufrufen */
- {
- case 'a' : PrtHlp(ahelp); break;
- case 's' : PrtHlp(shelp); break;
- case 'm' : PrtHlp(mhelp); break;
- case 'i' : PrtHlp(ihelp); break;
- case 'e' : PrtHlp(ehelp); break;
- case 'd' : PrtHlp(dhelp); break;
- case 'r' : PrtHlp(rhelp); break;
- case 'n' : PrtHlp(nhelp); break;
- case 'h' : PrtHlp(hhelp); break;
- }
- }
- if (strncmp(argv[i],"/r",2) == 0) /* Report in File*/
- {
- reports = 1;
- if (strlen(argv[i]) > 2)
- {
- strcpy(repfile,&argv[i][2]);
- if ((output = fopen(repfile,"w")) == NULL)
- {
- output = stdout; /* in File ging nicht, -> */
- mess(M_PRT,msg[MSG_FER]); /* Rep. auf stdout */
- }
- }
- }
- }
- else
- {
- if (exclude) /* Auszuschließende Files */
- {
- if (eargcnt < 16)
- {
- if ((eargums[eargcnt] =
- (char *)malloc(strlen(argv[i])+2)) != NULL)
- strcpy(eargums[eargcnt++],argv[i]);
- else Error("Kein Speicherplatz mehr !");
- }
- else
- {
- mess(M_REP | M_PRT,msg[MSG_FNOF]); exit(1);
- }
- }
- else /* zu löschende Files */
- {
- if (argcnt < 16)
- {
- if ((argums[argcnt] =
- (char *)malloc(strlen(argv[i])+2)) != NULL)
- strcpy(argums[argcnt++],argv[i]);
- else Error("Kein Speicherplatz mehr !");
- }
- else
- {
- mess(M_REP | M_PRT,msg[MSG_FNOF]); exit(1);
- }
- }
- }
- }
- if (help) /* Nach Hilfen Löschen abbrechen */
- Error("Hilfen wurden ausgegeben, " \
- "kein Löschvorgang gestartet !");
-
- if (argcnt == 0 && eargcnt > 0)
- {
- argums[argcnt] = (char *)malloc(5);
- strcpy(argums[argcnt++],"*.*");
- }
- getcwd(oldpath,MAXPATH); /* alten Pfad merken */
-
- for (i = 0; i < argcnt; i ++)
- {
- if ((name=(char *)malloc(strlen(argums[i])+2)) != NULL)
- strcpy(name,argums[i]);
- else Error("Kein Speicherplatz mehr !");
- if (name == NULL)
- Error("Kein Dateiname oder Verzeichnis angegeben !");
-
- splitflags = fnsplit(name,drive,dir,files,ext);
- if (splitflags & DRIVE) strcpy(fullpath,drive);
- else strncpy(fullpath,oldpath,2);
- fullpath[2] = '\0'; strcpy(aktpath,"\\");
- getcurdir(toupper(fullpath[0]) - '@',aktpath+1);
- if (!(splitflags & DIRECTORY)) strcat(fullpath,aktpath);
- else
- {
- if (dir[0] != '\\')
- {
- strcat(fullpath,aktpath);
- strcat(fullpath,"\\");
- strcat(fullpath,dir);
- }
- else strcat(fullpath,&dir[1]);
- }
- if ((fullpath[strlen(fullpath)-1] == '\\') &&
- (strlen(fullpath) > 3))
- fullpath[strlen(fullpath)-1] = '\0';
-
- if (chdir(fullpath) != 0 ) /* Pfad wechseln */
- {
- if (anzf > 0)
- mess(M_REP | M_PRT,msg[MSG_FLM],anzf,bytes);
- if (subdirs && anzd > 0)
- mess(M_REP | M_PRT,msg[MSG_DLM],anzd);
- if (nodel && (anzd > 0 || anzf > 0))
- mess(M_REP | M_PRT, msg[MSG_NOD]);
- Error("Konnte angegebenen Pfad nicht finden");
- }
- strcpy(name,files);
- strcat(name,ext);
- setdisk(toupper(fullpath[0])-'A');
-
- /* Löschfunktion aufrufen */
- if (matchdel)
- {
- delmatches(name);
- if (anzf == 0) mess(M_REP | M_PRT,msg[MSG_NF]);
- }
- else delfunkt(name);
-
- chdir(aktpath);
- chdir(oldpath);
- setdisk(toupper(oldpath[0])-'A');
- free(name);
- if (endxdel) break;
- }
- /* Abschlußmeldungen ausgeben */
- if (endxdel) mess(M_PRT,msg[MSG_BRK]);
- mess(M_REP | M_PRT,msg[MSG_FLM],anzf,bytes);
- if (subdirs) mess(M_REP | M_PRT,msg[MSG_DLM],anzd);
- if (nodel == 1) mess(M_REP | M_PRT, msg[MSG_NOD]);
- if (output != stdout) fclose(output);
- if (endxdel) return(27);
- return(0);
- }
-