(*
From: DAVIDDANIEL ANDERSON Refer#: 2239
Subj: FileSize in DOS Conf: (232) T_Pascal_R
The FileSize "returns the number of components" in a file. Thus, it
may not work as you might assume on untyped files, or files of records.
The file should be declared as a file of byte or char or as a text
file, in order to use FileSize.
An alternative to FileSize is to use the SearchRec type in the DOS
unit. This program deletes a file if it is 0 bytes. The filespec is
provided by the user on the command line, and can contain wildcards.
*)
PROGRAM delete_0_byte_files;
USES Dos;
VAR
MaybeZero : File of Byte; { the file in question }
DirInfo : SearchRec; { a record of the file }
FMask : PathStr; { entire path as specified by user }
MZName : PathStr; { path of file in question }
FDir : DirStr; { dir of file in question }
FName : NameStr; { name of file in question }
FExt : ExtStr; { ext of file in question }
NZero : Word; { number of files deleted }
BEGIN
NZero := 0;
IF ParamCount = 1 THEN
FMask := ParamStr(1) { use command line info, if it exists }
ELSE BEGIN
Writeln('You must specify a file_mask, such as "*.*"!');
Halt;
END;
FSplit(FExpand(FMask),FDir,FName,FExt); { split cmdlind info into }
IF (FName = '') THEN { components }
FMask := FMask + '*.*'; { if only a DOS path was specified, }
FindFirst(FMask, Archive, DirInfo); { append a wildcard spec }
WHILE DosError = 0 DO { check every valid file for size }
BEGIN { append path to name, to allow }
MZName := FDir+DirInfo.Name; { paths and drives other than current }
Assign(MaybeZero,MZName); { use Assign since Erase can only work }
{ on *files*, -not- file names }
IF (DirInfo.Size = 0) THEN BEGIN { THE MEAT! use the SearchRec }
Writeln('Deleting ',MZName); { for determining file size }
Erase(MaybeZero); { give a message and delete it }
NZero := NZero + 1; { incremented counter, of course }
END;
FindNext(DirInfo); { look for another matching file }
END;
Writeln('Files Deleted: ',NZero); { simply display total # deleted }
END.