Contributor: CHRIS LAUTENBACH { After looking around through some of my routines, I found a few that were generic enough that they might be of use to the rest of ya. My only request is that if you modify them and make them any cooler than they already are -- send me back a copy. Oh -- yeah -- and if you use them in your programs give me credit, or at least a registered copy. :) Here's a brief rundown of these routines: proc SeqRen - renames a file, keep a certain number of backups. EG: When you download a file, and one already exists, it renames them. Only thing is, that this keeps them in age order. :) func Filetype - determines the type of a file. Right now, it only knows about ZIP, ARJ, LHA, EXE and GIF files. If you can expand on this, feel free - and make sure you mail me back a copy of the new ones! :) func FileExistWild - takes a wildcard filename and determines if any files matching that spec are present. (Eg: *.EXE) The filename doesn't even have to be a wildcard, so you could use this as a generic function to see if a file exists or not. func SizeFile - takes a filename as input, and if the file exists, it returns the size of the file. Returns -1 if file does not exist. funct SwtVal - returns the value of a command line switch. For example, on a 'comms' (I hate that) program you might want to be able to specify an alternate COM: port on the command line. With this routine you could do that easily, just check for SwtVal('/COM:'). If the result is anything other than an empty string, then that is the value. You can specify multiple words per command line parameter by replacing the spaces with underscores ('_'). func StatusBar - You've all seen those programs which display those nifty progress bars as they do things. Now you can do it too! Simply call this with the total number of items (eg: the file size say 10 records for example) and the current item (eg: record 4 out of 10 records) and StatusBar will return a demi-hi-res progress bar as a string. :) func EraseFiles - Erases all the files in with a filespec matching the one it is passed. Example: EraseFiles('*.BAK') would delete all files with the .BAK extension in the current directory. } procedure SeqRen(Fn : string; Max : byte); { Sequentially rename file Fn, keeping Max number of files } var idx, rn : byte; sfn, efn, ofn : string; Rend, whole : boolean; f : file; function Merge(st:string; ln:longint):string; var tmp : string; begin tmp:=Long2Str(ln); if length(tmp)>1 then begin st[length(st)-1]:=tmp[1]; st[length(st)]:=tmp[2]; end else st[length(st)]:=tmp[1]; Merge:=St; end; begin Rend:=false;whole:=false;idx:=0; { Set up variables } If pos('.',fn)>0 then { Disect the filename } begin sfn:=copy(fn,1,pos('.',fn)-1); efn:=copy(fn,pos('.',fn)+1,length(fn)); end ELSE whole:=true; repeat Inc(idx); if not ExistFile(sfn+'.'+Merge(efn, idx)) then rend:=true; until (idx=max) or Rend; if (idx=max) and (rend=false) then { Nope? Okay, no problem. } begin Assign(f,sfn+'.'+Merge(efn, max)); { Rename all oldies and make } Erase(f); { room for it as number 1 } for idx:=(max-1) downto 1 do begin Assign(f,sfn+'.'+Merge(efn, idx)); Rename(f,sfn+'.'+Merge(efn, idx+1)); end; rn:=1; end; if rend then rn:=idx; Assign(f,fn); { Rename the requested file! } Rename(f,sfn+'.'+Merge(efn, rn)); end; Type FileIDType = (fEXE, fZIP, fARJ, fLHA, fGIF87); function FileType(Filename : string) : FileIDType; { This function attempts to identify what type of a file Filename is } var Infile : file; IdBytes : Array[1..10] of char; SubId : string; begin FileType := fUnknown; If NOT ExistFile(FileName) then Exit; Assign(Infile, FileName); Reset(Infile, 1); If (FileSize(Infile) = 0) then begin Close(Infile); Exit; end; BlockRead(Infile, IDBytes, 10); Close(Infile); SubId := Copy(IDBytes, 1, 2); If (SubID = 'MZ') then FileType := fEXE ELSE If (SubID = 'PK') then FileType := fZIP ELSE if (SubID = #96 + #234) then FileType := fARJ ELSE If (Copy(IDBytes, 3, 5) = '-lh5-') then FileType := fLHA ELSE If (Copy(IDBytes, 3, 5) = '-lh1-') then FileType := fLHA ELSE if (Copy(IDbytes, 1, 5) = 'GIF89a') then FileType := fGIF87; end; function FileExistWild(Mask : string) : boolean; { Does X*.* exist? :) } var sr : SearchRec; begin FindFirst(Mask, AnyFile, SR); If DosError<>18 then FileExistWild := TRUE ELSE FileExistWild := FALSE; end; Function SizeFile(Fname : string) : longint; var sr : SearchRec; idx : integer; begin SizeFile := 0; Findfirst(Fname, Anyfile, SR); If DosError = 0 then SizeFile := SR.Size ELSE SizeFile := -1; end; function SwtVal(Swt : string) : string; { Returns the value of a command line switch. Eg: for /COM:2, call SwtVal('/COM2:') and it will return 2. } var ndx, found : byte; st : string; begin Found := 0; For ndx := 1 to ParamCount do begin if StUpCase(copy(paramstr(ndx), 1, length(swt))) = StUpCase(swt) then begin Found := ndx; Break; end; end; if (Found = 0) then begin swtval := ''; Exit; end; st := ''; st := StUpCase(Copy(ParamStr(Found), Length(Swt) + 1, Length(ParamStr(Found)) - Length(Swt))); For ndx := 1 to Length(St) do if (St[ndx] = '_') then St[ndx] := #32; SwtVal := st; end; Function StatusBar(total, amt : longint) : string; Const BarLength = 40; var a, b, c, d : longint; percent : real; st : string; begin If (total = 0) OR (amt = 0) then begin StatusBar := ''; Exit; end; if (Amt > Total) then amt := total; Percent := Amt / Total * (Barlength * 10); a := trunc(percent); b := a div 10; c := 1; percent := amt / total * 100; d := trunc(percent); st := ' (' + int_to_str(d) + '%)'; StatusBar := CharStr(b * c, #219) + CharStr(Barlength - (b * c), #176) + st; end; function EraseFiles(Path, Mask : string) : integer; var S : SearchRec; begin FindFirst(Path + Mask, Anyfile - Directory, s); { Find the first file } If (DosError = 18) then exit; { No files to erase } KillFile(Path + s.name); { Erase the first file } repeat Findnext(s); { Find the next file } If NOT (DOSError=18) then KillFile(Path + s.name); { Erase the file } until Doserror=18; { no more files } EraseFiles := IOResult; { Return the IO result } end;