home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Current Shareware 1994 January
/
SHAR194.ISO
/
dos_util
/
af126.zip
/
AF.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-08-14
|
60KB
|
1,459 lines
Program AF; {Archive Finder}
{.$Define Err}
{$R+}
{.$DEFINE ENGLISH}
Uses Crt,Dos{$IfDef Err},Err{$Endif};
Const motRep = {$IfDef English} 'Directory';
{$Else} 'Répertoire'; {$Endif}
motKo = {$IfDef English} 'Kb';
{$Else} 'Ko'; {$Endif}
Const PatcherIci : String[7] = 'Config:';
Const SousRepAussi : Boolean = True;
EcrireToutesA : Boolean = False;
ArchivesSeules : Boolean = False;
NomComplet : Boolean = False;
Globale : Boolean = True;
PasLesArchives : Boolean = False;
VueRapide : Boolean = False;
UniquementTot : Boolean = False;
AffTotaux : Boolean = False;
TousReps : Boolean = True;
BelleVue : Boolean = True;
ProcessExe : Boolean = True;
UnCluster : Word = 0;
DefaultRep = '\';
DefRep : String[64] = DefaultRep;
Lecteurs : String[26] = 'CDE';
DateMini : LongInt = 0;
DateMaxi : LongInt = $7FFFFFFF;
TailleMini : LongInt = 0;
TailleMaxi : LongInt = $7FFFFFFF;
Type Fichier = Record
Nam : String[12];
Att : Byte;
Dat : LongInt;
Siz : LongInt;
End;
Const MaxFichiers = 65000 div SizeOf(Fichier);
Type FichiersT = Array[1..MaxFichiers] of Fichier;
Var Fichiers : ^FichiersT;
NbFics : Word;
Const MaxMask = 20;
Var Mask : Array[1..MaxMask] of String[128];
NbMasques : Byte;
NbArch : Word;
Ext : String[10];
RepOriginal : String;
KeepExit : Pointer;
Redirige : Boolean;
CrtS : Text;
TotalFound : LongInt;
SearchMask : String;
TotDsk,TotDskR : LongInt;
TotArc,TotArcR : LongInt;
NumA,NumD : Word;
NbArcFound : Word; {nbre d'archives trouvées par -a}
ChercheTailleClust : Boolean; {spécial quand on ne sait pas sur quel
disk sera faite la recherche}
Const Pile : Byte = 0;
Function OteBs(x:String):String;
{Supprime le \ final si ce n'est pas le rep principal qui est spécifié}
Begin
if (x<>'\') and (Length(x)>1) and (x[Length(x)]='\') then
if x[Pred(Length(x))]<>':' then dec(x[0]);
OteBs:=x;
End;
Function AjouteBs(x:String):String;
{Ajoute un \ final}
Begin
if x='' then x:='.\' else
if x[Length(x)]=':' then x:=x+'.\' else
if x[Length(x)]<>'\' then x:=x+'\';
AjouteBs:=x;
End;
Function Redir:Boolean;
{pas encore implémenté la manière parfaite de détecter la redirection,
mais je dois avoir le source quelque part...}
Var b : Array[1..256] of Byte;
Begin
Move(Mem[PrefixSeg:0],B,SizeOf(b)); Redir:=B[26]<>1;
End;
Function ClusterSize(c:Char):Word;
Type DPB = Record
Numero : Byte;
SousUnite : Byte;
OctPSect : Word;
Interleave : Byte;
SectPClust : Byte;
Reserves : Word;
NbreDeFats : Byte;
RootDir : Word;
PremSect : Word;
DernClust : Word;
SectPFat : Byte;
DataSect1 : Word;
Driver : Pointer;
Media : Byte;
Flag : Byte;
NextDPB : Pointer;
End;
Var p:^DPB;
b:Byte;
r:Registers;
Begin
b:=Byte(UpCase(c)); ClusterSize:=0;
if b in [$41..$5A] then
Begin
b:=b-$40;
With r do
Begin
Ah:=$32; Dl:=b; MsDos(r);
p:=Ptr(ds,bx);
if Al=0 then
With p^ do ClusterSize:=(1 shl SectPClust)*OctPSect;
End;
End;
End;
Function FullSize(s:LongInt):LongInt;
Var z:LongInt;
Begin
z:=0;
if UnCluster>0 then
Begin
z:=(s div UnCluster)*UnCluster;
if s mod UnCluster<>0 then z:=z+UnCluster;
End;
FullSize:=z;
End;
Procedure ProcessKey;
Var c:Char;
Begin
if Keypressed then
Begin
c:=ReadKey;
if c in [#0,'',' '] then {^S,' '=pause, #0=tche de fonction}
Begin
{$IfDef English}
Write(CrtS,'≡≡≡ P a u s e ≡≡≡ Press a key to continue');
{$Else}
Write(CrtS,'≡≡≡ P a u s e ≡≡≡ Une touche pour continuer');
{$Endif}
c:=ReadKey;
Write(CrtS,^M); ClrEol;
End;
if c in [^C,#27] then Halt;
End;
End;
Function Justify(x:String; b:Byte):String;
Var Len:Byte absolute x;
Begin
if Len>=b then Len:=b else While Len<b do x:=x+' '; Justify:=x;
End;
Function AffDate(d:DateTime):String;
Const Months : Array[0..12] of String[3]
{$IfDef English}
= ('???','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
{$Else}
= ('???','Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Déc');
{$Endif}
Var x,y,z:String[3];
Begin
With d do
Begin
Str(Day:2,x); Str(Year mod 100:2,z); y:=Months[Month];
End;
{$IfDef ENGLISH}
AffDate:=y+' '+x+' '+z;
{$Else}
AffDate:=x+'-'+y+'-'+z;
{$Endif}
End;
Function AffHeure(d:DateTime):String;
Var x,y:String[3];
Begin
With d do
Begin
Str(Hour,x); if Hour<10 then x:='0'+x;
Str(Min,y); if Min<10 then y:='0'+y;
End;
AffHeure:=x+':'+y;
End;
{$i C:\bp\cat\AF.INC}
Function Check(s:String):Boolean;
Var k:Byte;
Foo:Boolean;
Begin
k:=0;
Repeat
Inc(k); if Pos('.',s)=0 then s:=s+'.'; Foo:=sCheck(Mask[k],s);
Until foo or (k=NbMasques);
Check:=foo;
End;
function GetExeSize(ExeName:String; var TotSize,Expect:LongInt):Boolean;
{ returns true if EXE is already bind }
{ if Expect=0, file is not EXE }
Type ExeHeaderRec = {Information describing EXE file}
Record
Signature : Word; {EXE file signature}
LengthRem : Word; {Number of bytes in last page of EXE image}
LengthPages : Word; {Number of 512 byte pages in EXE image}
NumReloc : Word; {Number of relocation items}
HeaderSize : Word; {Number of paragraphs in EXE header}
MinHeap,MaxHeap : Word; {Paragraphs to keep beyond end of image}
StackSeg,StackPtr : Word; {Initial SS:SP, StackSeg relative to image base}
CheckSum : Word; {EXE file check sum, not used}
IpInit, CodeSeg : Word; {Initial CS:IP, CodeSeg relative to image base}
RelocOfs : Word; {Bytes into EXE for first relocation item}
OverlayNum : Word; {Overlay number, not used here}
End;
Var ExeF : file;
ExeHeader : ExeHeaderRec;
ExeValue : LongInt;
count : Word;
Begin
TotSize:=0; Expect:=0;
Assign(ExeF,ExeName); Reset(ExeF,1);
if IoResult=0 then
Begin
TotSize:=FileSize(ExeF);
BlockRead(ExeF,ExeHeader,SizeOf(ExeHeaderRec),Count);
With ExeHeader do
if Signature=$5A4D then
Begin
if LengthRem=0 then ExeValue:=LongInt(LengthPages) shl 9
else ExeValue:=(LongInt(Pred(LengthPages)) shl 9)+LongInt(LengthRem);
Expect:=ExeValue;
End;
End;
Close(ExeF);
GetExeSize:=(TotSize>Expect) and (Expect<>0);
End;
Procedure Reverse(Var l:LongInt);
{pour les .SIT (Mac) les nombres hexa sont dans l'ordre inverse...}
{Merci à Motorola et Intel de se mettre d'accord...}
Var l1:LongInt;
Begin
l1:=((l and $FF000000) shr 24) or ((l and $00FF0000) shr 8) or
((l and $0000FF00) shl 8) or ((l and $000000FF) shl 24);
l:=l1;
End;
Function OteRep(s:String):String;
Var i:Byte;
Begin
i:=Length(s); While (i>0) and (s[i]<>'\') and (s[i]<>':') do Dec(i);
if i>0 then Delete(s,1,i);
OteRep:=s;
End;
Procedure Examine(Nom:String; Taille:LongInt);
{Examen d'une archive, quel que soit son type}
Const MaxTampon = 200;
ZooId = $FDC4A7DC;
Type ZooHdrTyp = Record
Zoo_Text : Array[1..20] of Char; { Nom du compacteur }
Zoo_Tag : LongInt; { Identifie une archive Zoo }
Zoo_Start : LongInt; { Début des données }
Zoo_Minus : LongInt; { Vérification de concordance }
Zoo_Major : Char; { Version n° }
Zoo_Minor : Char; { Sous-version n° }
End;
Label Fin; {- Oui, je sais}
Var f : File;
Tampon : Array[1..MaxTampon] of Byte;
Lu : Word;
j1,j2 : Word; { pour compter la taille du nomfic et du commentaire }
NomFic : String; { Nom du fichier }
Algo : String[5]; { Algo de compression }
PSize : LongInt; { Packed Size }
USize : LongInt; { Unpacked (real) size }
Date : DateTime; { Date du fichier }
Flusher : LongInt; { Nombre d'octets à sauter jusqu'au prochain fichier }
i : Byte;
w : Word;
Li : LongInt;
Found : Word; { Nbr de fichiers trouvés }
Count : LongInt; { Position dans le fichier }
ZooHdr : ZooHdrTyp;
PassEntry : Boolean;
NumOnLine : Byte;
SizeP,SizeU : LongInt; { Tailles totales (Packed et Unpacked) }
Cmt : Boolean; { Est-ce un commentaire ? }
d1,d2 : LongInt; {taille des Datas pour les .SIT}
TailleDisk: LongInt; {Taille sur le disque}
St : String;
KeepAttr : Word;
b1 : Byte; {utilisé pour les EXE}
Begin
HighVideo;
Write(CrtS,^M);
if Redirige then ClrEol;
if ArchivesSeules and AffTotaux and not Redirige then Write(CrtS,Taille:9,' ');
if NomComplet then Write(CrtS,Nom) else Write(CrtS,'Archive '+Nom);
ClrEol;
Inc(NbArch);
Found:=0; Assign(f,Nom); GetFAttr(f,KeepAttr); SetFAttr(f,0);
Reset(f,1); Lu:=0; Count:=0;
if Ext='EXE' then Begin
if (not GetExeSize(Nom,d1,d2)) or (d2=0) then Begin Write(CrtS,^M); Goto Fin; End;
BlockRead(f,Tampon[1],MaxTampon,Lu);
if Lu<MaxTampon then Begin Write(CrtS,^M); Goto Fin; End;
if MaxTampon>255 then b1:=255 else b1:=MaxTampon;
Move(Tampon[1],St[1],b1); St[0]:=Chr(b1);
if Pos('Yoshi',St)<>0 then Begin Ext:='LZH'; Count:=d2; End else
if Pos('RJSX',St)<>0 then Begin Ext:='ARJ'; Count:=d2+2; End else
Begin Ext:='ZIP'; Count:=d2; End;
{Begin Write(CrtS,^M); Goto Fin; End;}
{Pkware ayant la fâcheuse habitude de ne pas faire les choses
simplement, les Zip2Exe ne sont pas reconnus pour le moment.
Bien fait !}
if not NomComplet then Write(CrtS,' ('+Ext+')');
End else
if Ext='ZOO' then
Begin
BlockRead(f,ZooHdr,SizeOf(ZooHdr),Lu);
if Lu<SizeOf(ZooHdr) then Begin Write(CrtS,^M); Goto Fin; End;
Count:=ZooHdr.Zoo_Start;
End else
if Ext='SIT' then
Begin
Count:=150; {moi non plus, je ne sais plus pourquoi}
End;
Write(CrtS,^M);
NumOnLine:=0; SizeP:=0; SizeU:=0; TailleDisk:=0;
Repeat
Seek(f,Count); PassEntry:=False; Cmt:=False;
ProcessKey;
BlockRead(f,Tampon[1],MaxTampon,Lu);
if Lu<26 then Goto Fin;
if Ext='SIT' then
Begin
Move(Tampon[3],NomFic,64);
Move(Tampon[85],USize,4); Reverse(USize);
Move(Tampon[93],PSize,4); Reverse(PSize);
Move(Tampon[89],d1,4); Reverse(d1);
Move(Tampon[97],d2,4); Reverse(d2);
PSize:=PSize+d2; USize:=USize+d1;
if Tampon[1]=0 then i:=Tampon[2] else i:=Tampon[1];
Case i of
0: Algo:='Stord';
2: Algo:=' LZW ';
else Algo:='?????';
End;
Li:=0;
Flusher:=100+PSize+12; {Pourquoi 12 ? Bonne question}
End else
if Ext='ZOO' then
Begin
Move(Tampon[1],Li,4);
if Li<>ZooId then Goto Fin;
Case Tampon[6] of
0: Algo:='Store';
1: Algo:=' Lzw ';
else Begin Str(Tampon[6]:3,Algo); Algo:='? '+Algo; End;
End;
Move(Tampon[25],PSize,4);
Move(Tampon[21],USize,4);
i:=39; NomFic:='';
While Tampon[i]<>0 do Begin NomFic:=NomFic+UpCase(Chr(Tampon[i])); Inc(i); End;
Flusher:=0; Move(Tampon[7],Count,4);
Move(Tampon[15],w,2); Li:=LongInt(w) shl 16;
Move(Tampon[17],w,2); Li:=Li+w;
End else
if Ext='TPZ' then
Begin
Case Tampon[25] of
0: Algo:='inclu';
1: Algo:='implo';
End;
Move(Tampon[26],USize,4);
Move(Tampon[30],PSize,4);
NomFic:='';
i:=56;
While (Tampon[i]<>32) And (i<56+67) do
Begin
NomFic:=NomFic+UpCase(Chr(Tampon[i])); Inc(i);
End;
i:=43;
While (Tampon[i]<>32) And (i<43+12) do
Begin
NomFic:=NomFic+UpCase(Chr(Tampon[i])); Inc(i);
End;
Flusher:=PSize+122;
Move(Tampon[36],Li,4);
End else
if Ext='LZH' then
Begin
Move(Tampon[3],St[1],3); St[0]:=#3;
if St<>'-lh' then Goto Fin;
Move(Tampon[22],NomFic,Tampon[22]+1);
Algo[0]:=#5; Move(Tampon[3],Algo[1],5);
Move(Tampon[8],PSize,4);
Move(Tampon[12],USize,4);
Move(Tampon[18],w,2); Li:=LongInt(w) shl 16;
Move(Tampon[16],w,2); Li:=Li+w;
Flusher:=PSize+2+Tampon[1];
End else
if (Ext='ARJ') or ((Ext[1]='A') and (Ext[2] in ['0'..'9'])) then
Begin
Move(Tampon[1],w,2);
if w<>$EA60 then
Goto Fin;
Move(Tampon[17],PSize,4);
Move(Tampon[21],USize,4);
i:=35; NomFic:=''; j1:=1;
While Tampon[i]<>0 do Begin
NomFic:=NomFic+Chr(Tampon[i]); Inc(i); Inc(j1);
End;
Case Tampon[10] of
0: Algo:='Store';
else Algo:='Met.'+Chr($30+Tampon[10]);
End;
Cmt:=Tampon[11]=2;
Move(Tampon[3],w,2);
Move(Tampon[13],Li,4);
if Cmt then Begin
Flusher:=4+w+4+2;
End else Flusher:=14+w+PSize-4;
End else
if Ext='ZIP' then
Begin
if (Tampon[1]<>Ord('P')) or (Tampon[2]<>Ord('K')) then Goto Fin;
Move(Tampon[1],Li,4); if Li=$02014B50 then Goto Fin;
Move(Tampon[9],w,2);
Case w of
0: Algo:='Stord';
1: Algo:='Shrun';
2: Algo:='Redu1';
3: Algo:='Redu2';
4: Algo:='Redu3';
5: Algo:='Redu4';
6: Algo:='Implo';
7: Algo:='Token';
8: Algo:='Defla'; {or EXTRA compression}
else Str(w:5,Algo);
End;
Move(Tampon[13],w,2); Li:=LongInt(w) shl 16;
Move(Tampon[11],w,2); Li:=Li+w;
Move(Tampon[19],PSize,4);
Move(Tampon[23],USize,4);
Move(Tampon[27],w,2); if w>255 then w:=255;
NomFic[0]:=Chr(w); Move(Tampon[31],NomFic[1],w);
Flusher:=30+w+PSize;
Move(Tampon[29],w,2);
Flusher:=Flusher+w;
End else
if (Ext='ARC') or (Ext='PAK') then
Begin
Case Tampon[2] of
0: Goto Fin;
1: Algo:='Stor1';
2: Algo:='Stor2';
3: Algo:='Packd';
4: Algo:='Squzd';
5: Algo:='Crun1';
6: Algo:='Crun2';
7: Algo:='Crun3';
8: Algo:='Crun4';
9: Algo:='Sqash';
else Algo:=' ? ';
End;
i:=3; NomFic:='';
While Tampon[i]<>0 do Begin NomFic:=NomFic+Chr(Tampon[i]); Inc(i); End;
Move(Tampon[16],PSize,4);
if Tampon[2]=1 then USize:=PSize
else Move(Tampon[26],USize,4);
if Tampon[2]=1 then Flusher:=25+PSize
else Flusher:=29+Psize;
Move(Tampon[18],Li,4);
End;
UnPackTime(Li,Date);
While Pos('/',NomFic)<>0 do NomFic[Pos('/',NomFic)]:='\';
if (Li>=DateMini) and (Li and $FFFF0000<=DateMaxi) and
(USize>=TailleMini) and (USize<=TailleMaxi) then
if (NomFic<>'') and not Cmt then if Check(OteRep(NomFic)) then
Begin
if Found=0 then
Begin
if Redirige and (ArchivesSeules or not EcrireToutesA) then
if NomComplet then WriteLn(Nom)
else WriteLn('Archive '+Nom);
if not Redirige then Begin LowVideo; WriteLn(CrtS); End;
if not (VueRapide or UniquementTot or NomComplet or ArchivesSeules) then
Begin
{$IfDef English}
WriteLn('File name Methd UnpSize PakSize Prct Date Time ');
{$Else}
WriteLn('Nom du fichier Méthd TRéelle TComprs Prct Date Heure');
{$Endif}
WriteLn('------------------------------ ----- ------- ------- ---- --------- -----');
End;
End;
Inc(Found); Inc(TotalFound); Inc(SizeU,USize); Inc(SizeP,PSize);
Inc(NumA);
Inc(TotArc,USize);
Inc(TotArcR,FullSize(USize));
TailleDisk:=TailleDisk+FullSize(USize);
if not (UniquementTot or ArchivesSeules) then
if VueRapide then
Begin
Inc(NumOnLine);
While Pos('\',NomFic)<>0 do Delete(NomFic,1,Pos('\',NomFic));
Write(' '+Justify(NomFic,12));
if NumOnLine=5 then
Begin
WriteLn(' '); NumOnLine:=0;
End else Write(' ');
End else
if NomComplet
then WriteLn(NomFic)
else Begin
Write(Justify(NomFic,30),' '+Algo,USize:8,' ',PSize:8,' ');
if USize>0 then Write(LongInt(PSize)*100 div USize:3,'%')
else Write('100%');
if Li<>0 then Write(' ',AffDate(Date),' ',AffHeure(Date));
WriteLn;
End;
End;
if ArchivesSeules and (found>0) then Begin
Inc(NbArcFound); Goto Fin;
End;
Inc(Count,Flusher);
Until false;
Fin: Close(f);
SetFAttr(f,KeepAttr);
if VueRapide and (NumOnLine>0) then WriteLn;
if Found>0 then if NomComplet and not ArchivesSeules then WriteLn else
if not ArchivesSeules then
if AffTotaux then
Begin
if not (VueRapide or UniquementTot) then
WriteLn('------------------------------ ------- -------');
if TailleDisk=0 then St:='' else
Begin
Str(TailleDisk,St);
St:='('+St+')';
End;
if VueRapide then i:=24 else i:=36;
if Found=1 then
{$IfDef ENGLISH}
Write(Justify('1 file '+St,i)) else
{$Else}
Write(Justify('1 fichier '+St,i)) else
{$Endif}
Begin
Str(Found,Algo);
{$IfDef ENGLISH}
Write(Justify(Algo+' files '+St,i));
{$Else}
Write(Justify(Algo+' fichiers '+St,i));
{$Endif}
End;
WriteLn(SizeU:8,' ',SizeP:8,' ',SizeP*100 div SizeU:3,'%');
WriteLn;
End else if Found>0 then WriteLn;
End;
Function WriteAttr(b:Byte):String;
Var x:String;
Begin
x:='';
if b and $1 =$1 then x:=x+'r' else x:=x+' ';
if b and $2 =$2 then x:=x+'h' else x:=x+' ';
if b and $4 =$4 then x:=x+'s' else x:=x+' ';
if b and $20=$20 then x:=x+'a' else x:=x+' ';
WriteAttr:=x;
End;
Var TmpStr : String; {Cherche est récursive !}
Dt : DateTime;
i : Word;
NumOnLine : Byte;
TotalSize : LongInt;
TotalDisk : LongInt;
St2 : String;
Procedure Cherche(Rep:ComStr);
{Recherche récursive sur les fichiers du disque.}
Type RepTypPtr = ^RepTyp;
RepTyp = Record
n:RepTypPtr; {pointe sur le prochain}
s:String[12];
End;
Var Sr:SearchRec;
FirstRep,ChnRep:RepTypPtr;
Begin
Inc(Pile);
{$i-} ChDir(Rep); {$i+}
if IoResult<>0 then
Begin
if EcrireToutesA and not NomComplet then
Begin
{$IfDef English}
TmpStr:='Invalid directory '+Rep;
{$Else}
TmpStr:='Répertoire '+Rep+' invalide';
{$Endif}
HighVideo;
if Redirige then Begin Write(TmpStr); ClrEol; WriteLn; End
else Begin
Write(CrtS,^M+TmpStr); ClrEol;
LowVideo; WriteLn(CrtS);
End;
End;
Exit;
End;
GetDir(0,TmpStr); if TmpStr[Length(TmpStr)]<>'\' then TmpStr:=TmpStr+'\';
if ChercheTailleClust then
Begin
ChercheTailleClust:=false; UnCluster:=ClusterSize(TmpStr[1]);
End;
HighVideo;
Write(CrtS,^M+motRep+' '+OteBS(TmpStr)); ClrEol; Write(CrtS,^M);
LowVideo;
NbFics:=0;
FindFirst(SearchMask,AnyFile-VolumeId,Sr); ProcessKey;
if TousReps then
Begin
New(ChnRep); FillChar(ChnRep^,Sizeof(ChnRep^),0); FirstRep:=ChnRep;
End;
if DosError=0 then
With Sr do While DosError=0 do
Begin
if Attr and Directory<>0 then
Begin
if TousReps and (Name<>'.') and (Name<>'..') then
Begin
ChnRep^.s:=Name; New(ChnRep^.n);
ChnRep:=ChnRep^.n; FillChar(ChnRep^,SizeOf(ChnRep^),0);
End;
End else
Begin
if Time<0 then Time:=0;
if Globale and (Time>=DateMini)
and (Time and $FFFF0000<=DateMaxi)
and (Size>=TailleMini)
and (Size<=TailleMaxi)
and Check(Name)
then
Begin
Inc(NbFics); Inc(TotalFound); Inc(NumD);
With Fichiers^[NbFics] do
Begin
Nam:=Name; Siz:=Size; Dat:=Time; Att:=Attr;
Inc(TotDsk,Size); Inc(TotDskR,FullSize(Size));
End;
End;
if not PasLesArchives then
Begin
if Pos('.',Name)<>0 then Ext:=Copy(Name,Pos('.',Name)+1,3)
else Ext:='';
if (Ext='LZH') or (Ext='ARJ') or (Ext='ZIP') or (Ext='ARC') or
(Ext='PAK') or (Ext='ZOO') or (Ext='SIT') or (Ext='TPZ')
or ((Ext='EXE') and ProcessExe)
or ((Ext[1]='A') and (Ext[2] in ['0'..'9']) and (Ext[3] in ['0'..'9']))
then Examine(TmpStr+Name,Size)
End;
End;
ProcessKey; FindNext(Sr);
End;
if NbFics>0 then
Begin
NumOnLine:=0; HighVideo; TotalSize:=0; TotalDisk:=0;
if BelleVue or NomComplet then Begin LowVideo; ClrEol; End else
if Redirige then Begin Write(motRep+' '+OteBs(TmpStr)); ClrEol; WriteLn; End
else Begin
Write(CrtS,^M+MotRep+' '+OteBs(TmpStr)); ClrEol;
LowVideo; WriteLn(CrtS);
End;
LowVideo;
if not (BelleVue or NomComplet or VueRapide or UniquementTot) then
Begin
{$IfDef English}
WriteLn('File name Size Date Time ');
{$Else}
WriteLn('Nom fichier Taille Date Heure');
{$Endif}
WriteLn('------------ ------- --------- -----');
End;
For i:=1 to NbFics do With Fichiers^[i] do
Begin
TotalSize:=TotalSize+Siz; TotalDisk:=TotalDisk+FullSize(Siz);
ProcessKey;
UnpackTime(Dat,DT);
if NomComplet then WriteLn(AjouteBs(OteBs(TmpStr))+Nam) else
if not UniquementTot then
if BelleVue then
WriteLn(Justify(Nam,12)+' ',Siz:8,' '+AffDate(Dt)+' '+
AffHeure(Dt)+' '+AjouteBs(OteBs(TmpStr))) else
if VueRapide then
Begin
Inc(NumOnLine);
Write(' '+Justify(Nam,12));
if NumOnLine=5 then
Begin
WriteLn; NumOnLine:=0;
End else Write(' ');
End else
WriteLn(Justify(Nam,12)+' ',Siz:8,' '+AffDate(Dt)+' '+AffHeure(Dt));
End;
if VueRapide and (NumOnLine<>0) then WriteLn;
if AffTotaux then
Begin
if not (VueRapide or UniquementTot) then
WriteLn(' -------');
if NbFics=1 then {$IfDef English}Write(Justify('1 file',13))
{$Else}Write(Justify('1 fichier',13)){$Endif}
else
Begin
Str(NbFics,St2);
{$IfDef English}
Write(Justify(St2+' files',13));
{$Else}
Write(Justify(St2+' fichiers',13));
{$Endif}
End;
WriteLn(' ',TotalSize:7,' (',TotalDisk,')');
End;
if not NomComplet then WriteLn;
End else if (not ArchivesSeules and EcrireToutesA) then
if Redirige then Writeln(motRep+' '+OteBs(TmpStr))
else Begin LowVideo; WriteLn(CrtS); End;
if SousRepAussi then
Begin
if not TousReps then
Begin
FindFirst('*.',Directory,Sr);
With Sr do While DosError=0 do
Begin
if (Attr and Directory=Directory) and (Name<>'.') and (Name<>'..') then
Cherche(Name);
FindNext(Sr);
End;
End else
if (FirstRep^.n<>Nil) or (FirstRep^.s<>'') then
Begin
ChnRep:=FirstRep;
While ChnRep<>Nil do
Begin
if ChnRep^.s<>'' then Cherche(ChnRep^.s);
FirstRep:=ChnRep; ChnRep:=ChnRep^.n; Dispose(FirstRep);
End;
End else Dispose(FirstRep);
End;
Dec(Pile); if Pile>0 then ChDir('..');
Write(CrtS,^M); ClrEol; LowVideo;
End;
Function PlusMoins(Var x:String):Byte;
{Gestion des paramètres de la ligne de commande}
Begin
Delete(x,1,1);
if x[1]='-' then Begin PlusMoins:=0; Delete(x,1,1); End else
if x[1]='+' then Begin PlusMoins:=1; Delete(x,1,1); End else
PlusMoins:=2;
End;
Function LisDate(Var s:String):LongInt;
Var Dt:DateTime;
L:LongInt;
dow:Word;
ErrVal:Integer;
Begin
Delete(s,1,1); L:=-1;
With Dt do
if Length(s)>=6 then
Begin
{$IfDef English}
Val(Copy(s,3,2),Day,ErrVal); if ErrVal<>0 then Day:=1;
Val(Copy(s,1,2),Month,ErrVal); if ErrVal<>0 then Month:=1;
{$Else}
Val(Copy(s,1,2),Day,ErrVal); if ErrVal<>0 then Day:=1;
Val(Copy(s,3,2),Month,ErrVal); if ErrVal<>0 then Month:=1;
{$Endif}
Val(Copy(s,5,2),Year,ErrVal); if ErrVal<>0 then Year:=1;
Year:=Year+1900; While Year<1980 do Inc(Year,100);
Hour:=0; Min:=0; Sec:=0;
PackTime(Dt,L); Delete(s,1,6);
End else
if (s='') or (s[1]<'0') or (s[1]>'9') then
Begin
GetDate(Year,Month,Day,Dow); Hour:=0; Min:=0; Sec:=0;
While Year<1980 do Inc(Year,100);
PackTime(Dt,l);
End else {$IfDef English}
WriteLn('/D invalid date (mmddyy)');
{$Else}
WriteLn('/D date invalide (JJMMYY)');
{$Endif}
LisDate:=L;
End;
Function ShowDate(l:LongInt):String;
Var s,x:String[6];
Dt:DateTime;
Begin
UnpackTime(l,Dt);
With Dt do Begin
s:='';
{$IfDef English}
if Month<10 then s:=s+'0'; Str(Month,x); s:=s+x;
if Day<10 then s:=s+'0'; Str(Day,x); s:=s+x;
{$Else}
if Day<10 then s:=s+'0'; Str(Day,x); s:=s+x;
if Month<10 then s:=s+'0'; Str(Month,x); s:=s+x;
{$Endif}
Year:=Year mod 100; if Year<10 then s:=s+'0'; Str(Year,x); s:=s+x;
End;
ShowDate:=s;
End;
Function LisTaille(Var x:String):LongInt;
{Extraction de la taille après /i±999}
Var s:String;
L:LongInt;
ErrVal:Integer;
Begin
Delete(x,1,1); LisTaille:=-1;
if x<>'' then
Begin
s:='';
While (x<>'') and (x[1]>='0') and (x[1]<='9') do
Begin
s:=s+x[1]; Delete(x,1,1);
End;
Val(s,L,ErrVal); if ErrVal<>0 then L:=-1;
LisTaille:=L;
End;
End;
Procedure LisParametres;
Const Pm : Array[Boolean] of Char = ('-','+');
Var Msk,Ext,x,y,z,t,Rep:String;
i,j:Byte;
Stupid,DefRepSet,AffHelp,Debug:Boolean; {Si /R a déjà été spécifié}
Begin
SearchMask:='*.*'; NbMasques:=0; DefRepSet:=False; Rep:=''; Stupid:=False;
ChercheTailleClust:=False; AffHelp:=False; Debug:=False;
if ParamCount>0 then
Begin
For i:=1 to ParamCount do
Begin
x:=ParamStr(i); For j:=1 to Length(x) do x[j]:=UpCase(x[j]);
if x[1]='?' then AffHelp:=True else
if (x[1]='/') or (x[1]='-') then
Begin
Delete(x,1,1);
While x<>'' do
Case x[1] of
'A' : Begin
Case PlusMoins(x) of
0: ArchivesSeules:=False;
1: ArchivesSeules:=True;
2: ArchivesSeules:=not ArchivesSeules;
End;
if ArchivesSeules then
Begin
EcrireToutesA:=True; Globale:=False;
End;
End;
'B' : Case PlusMoins(x) of
0: BelleVue:=False;
1: BelleVue:=True;
2: BelleVue:=not BelleVue;
End;
'C' : Begin
Case PlusMoins(x) of
0: SousRepAussi:=False;
1: SousRepAussi:=True;
2: SousRepAussi:=not SousRepAussi;
End;
if not DefRepSet then
Begin
DefRep:='';
DefRepSet:=True;
GetDir(0,y); Lecteurs:=y[1];
End;
End;
'D' : Begin
Delete(x,1,1);
Case x[1] of
'+': DateMini:=LisDate(x);
'-': DateMaxi:=LisDate(x);
'=': Begin
DateMini:=LisDate(x);
DateMaxi:=DateMini;
End;
else {$IfDef English} WriteLn('/D incorrect syntax');
{$Else} WriteLn('/D syntaxe incorrecte'); {$Endif}
End;
End;
'E' : Case PlusMoins(x) of
0: EcrireToutesA:=False;
1: EcrireToutesA:=True;
2: EcrireToutesA:=not EcrireToutesA;
End;
'F' : Case PlusMoins(x) of
0: AffTotaux:=False;
1: AffTotaux:=True;
2: AffTotaux:=not AffTotaux;
End;
'G' : Case PlusMoins(x) of
0: Globale:=False;
1: Globale:=True;
2: Globale:=not Globale;
End;
'I' : Begin
Delete(x,1,1);
Case x[1] of
'+': TailleMini:=LisTaille(x);
'-': TailleMaxi:=LisTaille(x);
'=': Begin
TailleMini:=LisTaille(x);
TailleMaxi:=TailleMini;
End;
else {$IfDef English} WriteLn('/I incorrect syntax');
{$Else} WriteLn('/I syntaxe incorrecte'); {$Endif}
End;
End;
'L' : Begin
Delete(x,1,1);
if x<>'' then
if x='0' then Begin
GetDir(0,y); Lecteurs:=y[1];
End else Lecteurs:=x;
x:='';
End;
'M' : Begin
Delete(x,1,1);
if x<>'' then
Begin
FSplit(x,y,z,t);
if y<>'' then DefRep:=OteBS(y);
if Pos(':',y)<>0 then Begin
Lecteurs:=y[1];
End;
SearchMask:=z+t; x:='';
End;
End;
'N' : Case PlusMoins(x) of
0: NomComplet:=False;
1: NomComplet:=True;
2: NomComplet:=not NomComplet;
End;
'P' : Case PlusMoins(x) of
0: PasLesArchives:=False;
1: PasLesArchives:=True;
2: PasLesArchives:=not PasLesArchives;
End;
'R' : Begin
Delete(x,1,1);
if x<>'' then
Begin
DefRep:=x; DefRepSet:=True;
if x[2]=':' then Lecteurs:=x[1];
x:='';
End;
End;
'S' : Case PlusMoins(x) of
0: SousRepAussi:=False;
1: SousRepAussi:=True;
2: SousRepAussi:=not SousRepAussi;
End;
'T' : Begin
Delete(x,1,1);
if x<>'' then
Begin
AffTotaux:=True;
if x[1]='0' then
Begin
ChercheTailleClust:=True;
Delete(x,1,1);
End else
if x[1] in ['A'..'Z'] then
Begin
UnCluster:=ClusterSize(x[1]);
Delete(x,1,1);
ChercheTailleClust:=False;
End else
if x[1]='-' then
Begin
Delete(x,1,1); ChercheTailleClust:=False;
End;
End;
End;
'U' : Case PlusMoins(x) of
0: UniquementTot:=False;
1: UniquementTot:=True;
2: UniquementTot:=not UniquementTot;
End;
'W' : Case PlusMoins(x) of
0: VueRapide:=False;
1: VueRapide:=True;
2: VueRapide:=not VueRapide;
End;
'X' : Case PlusMoins(x) of
0: ProcessExe:=False;
1: ProcessExe:=True;
2: ProcessExe:=not ProcessExe;
End;
'*' : Case PlusMoins(x) of
0: TousReps:=False;
1: TousReps:=True;
2: TousReps:=not TousReps;
End;
'#' : Case PlusMoins(x) of
0: Redirige:=False;
1: Redirige:=True;
2: Redirige:=not Redirige;
End;
'?' : Begin Delete(x,1,1); AffHelp:=True; End;
')' : Begin Delete(x,1,1); Debug:=True; End;
else Delete(x,1,1);
End;
End else
Begin
{ On fait le FSplit à la main pour avoir des MASK et EXT
ayant des tailles supérieures aux normes DOS. Par
exemple: AF *LIS*MOI*.V*D* }
if x[Length(x)]=':' then x:=x+'.\'; j:=Length(x);
While (j>0) and (x[j]<>'\') and (x[j]<>':') do Dec(j);
if j>0 then
Begin
if (j>1) then Rep:=Copy(x,1,j-1) else
if j=1 then Rep:='\';
if j<>Length(x) then x:=Copy(x,j+1,Length(x)-j)
else x:='';
End;
j:=Pos('.',x);
if j>0 then
Begin
Msk:=Copy(x,1,j-1); Ext:=Copy(x,j,Length(x)-j+1);
End else
Begin
Msk:=x; Ext:='';
End;
While Pos('**',Msk)<>0 do Delete(Msk,Pos('**',Msk),1);
{ on agrandis la recherche dans la limite du raisonnable }
if (Msk[Length(Msk)]<>'*') and (Ext='') then Msk:=Msk+'*';
Msk:=Msk+Ext;
if NbMasques=MaxMask then
{$IfDef English}
WriteLn('WARNING: only ',MaxMask,' will be used !') else
{$Else}
WriteLn('ATTENTION: seulement ',MaxMask,' pris en compte !') else
{$Endif}
Begin
Inc(NbMasques); Mask[NbMasques]:=Msk;
End;
End;
End;
End;
if Globale and PasLesArchives and not DefRepSet and (Rep<>'')
then DefRep:=Rep;
if UniquementTot then
Begin
if not AffTotaux then
Begin
AffTotaux:=True; ChercheTailleClust:=True;
End;
BelleVue:=False;
End;
if (ArchivesSeules and PasLesArchives) or
(not Globale and PasLesArchives) then
Begin
Stupid:=True;
{$IfDef English}
WriteLn('What a stupid request ! Try option /)');
{$Else}
WriteLn('Quelle requête idiote ! Essayez l''option /)');
{$Endif}
End;
if ArchivesSeules then Globale:=False;
if NbMasques=0 then
Begin
Inc(NbMasques); Mask[1]:='*';
End;
if (SearchMask<>'*.*') and TousReps and SousRepAussi
then TousReps:=False;
if PasLesArchives and Globale and not TousReps and (NbMasques=1) then
Begin
i:=Pos('*',Mask[1]);
if (i=0) or (i<>Length(Mask[1])) or (Mask[1][Succ(i)]<>'.')
then SearchMask:=Mask[1] else TousReps:=True;
End;
if Pos('.',SearchMask)=0 then
Begin
if SearchMask[Length(SearchMask)]<>'*' then SearchMask:=SearchMask+'*';
SearchMask:=SearchMask+'.*';
End;
if DefRep[Length(DefRep)]=':' then DefRep:=DefRep+'.\';
if AffHelp or Debug then
Begin
if not Debug then
Begin
{$IfDef English}
WriteLn('Usage: AF [Mask*.*] [*Mask*] [/Parameter(s)] [-Parameter(s)]');
{$Else}
WriteLn('Usage: AF [Masque*.*] [*Masque*] [/Paramètre(s)] [-Paramètre(s)]');
{$Endif}
WriteLn;
End;
{$IfDef English}
Write(' /a '+PM[ArchivesSeules]+' Archive names only ');
Write(' /b '+PM[BelleVue]+' Beautiful vue');
WriteLn;
Write(' /c Current directory only ');
Write(' /d... Date (/d+311291 /d=010191)');
WriteLn;
Write(' /e '+PM[EcrireToutesA]+' Every name written ');
Write(' /f '+PM[AffTotaux]+' Full statistics ');
WriteLn;
Write(' /g '+PM[Globale]+' Global search ');
Write(' /i... sIze (/i+1024 /i-2048) ');
WriteLn;
Write(' /l... Look drives: '+Justify(Lecteurs,12)+' ');
Write(' /m... Mask for archives: '+Justify(SearchMask,16)+' ');
WriteLn;
Write(' /n '+PM[NomComplet]+' Names only');
WriteLn;
Write(' /p '+PM[PasLesArchives]+' skiP archives ');
Write(' /r... staRting at directory');
WriteLn;
Write(' /s '+PM[SousRepAussi]+' Subdirs also ');
Write(' /t... True size on disk');
WriteLn;
Write(' /u '+PM[UniquementTot]+' show only totals ');
Write(' /w '+PM[VueRapide]+' Wide display ');
WriteLn;
Write(' /x '+PM[ProcessExe]+' handle EXE files ');
Write(' /* '+PM[TousReps]+' all directories');
{$Else}
Write(' /a '+PM[ArchivesSeules]+' noms Archives seulement ');
Write(' /b '+PM[BelleVue]+' Belle vue');
WriteLn;
Write(' /c dans Ce répertoire ');
Write(' /d... date (/d+'+ShowDate(DateMini)+' /d-'+ShowDate(DateMaxi)+')');
WriteLn;
Write(' /e '+PM[EcrireToutesA]+' tous les noms ');
Write(' /f '+PM[AffTotaux]+' aFficher les totaux ');
WriteLn;
Write(' /g '+PM[Globale]+' recherche Globale ');
Write(' /i... taille (/i+1024 /i-2048)');
WriteLn;
Write(' /l... Lecteurs: '+Justify(Lecteurs,12)+' ');
Write(' /m... Masque: '+Justify(SearchMask,16)+' ');
WriteLn;
Write(' /n '+PM[NomComplet]+' Nom complets');
WriteLn;
Write(' /p '+PM[PasLesArchives]+' Pas les archives ');
Write(' /r... Répertoire de départ');
WriteLn;
Write(' /s '+PM[SousRepAussi]+' Sous-répertoires ');
Write(' /t... Taille réelle');
WriteLn;
Write(' /u '+PM[UniquementTot]+' totaux Uniquement ');
Write(' /w '+PM[VueRapide]+' affichage ''Wide''');
WriteLn;
Write(' /x '+PM[ProcessExe]+' examine les EXE ');
Write(' /* '+PM[TousReps]+' tous les répertoires');
{$Endif}
WriteLn;
if not Debug then
Begin
WriteLn;
{$Ifdef ENGLISH}
WriteLn('AF looks all over the disks through archives created by Arj, PkZip, Lha,');
WriteLn('LhArc, PkArc/PkPak, Arc, Zoo, StuffIt and Tpz for the specified masks.');
WriteLn('Exemples: AF *.DOC >MyFile.lst Result is in "MYFILE.LST"');
WriteLn(' AF *.DOC /gmFREE*.ZIP Only looks in FREE*.ZIP archives');
WriteLn(' AF *.DOC /rC:\UTIL Start searching in C:\Util');
WriteLn(' AF -cgmDOC.ZIP -tC Shows true size after unpacking on C:');
{$ELSE}
WriteLn('AF cherche sur tout le disque dans les archives créées par Arj, PkZip, Lha,');
WriteLn('LhArc, PkArc/PkPak, Arc, Zoo, StuffIt et Tpz le masque spécifié.');
WriteLn('Exemples: AF *.DOC >Fichier.lst le résultat est dans "FICHIER.LST"');
WriteLn(' AF *.DOC /gmFREE*.ZIP recherche dans les FREE*.ZIP seulement');
WriteLn(' AF *.DOC /rC:\UTIL commencer la recherche à C:\Util');
WriteLn(' AF -cgmDOC.ZIP -tC affiche la taille décompactée sur C:');
{$Endif}
End else
Begin
{$IfDef English}
Write('Mask(s): ');
{$else}
Write('Masque(s): ');
{$Endif}
For i:=1 to NbMasques do Write('»'+Justify(Mask[i],16)+'« ');
End;
Halt;
End;
if Stupid then Halt(1);
End;
{$F+} Procedure MyExitProc; {$F-}
Var c:String[1];
s:String;
Begin
LowVideo;
if Redirige or not EcrireToutesA then
Begin
Write(CrtS,^M); ClrEol;
End;
if Redirige then WriteLn(CrtS);
if AffTotaux then
if ArchivesSeules then Begin
if NbArcFound>0 then c:='s' else c:='';
{$IfDef English}
WriteLn(NbArcFound:4,' archive'+c+' found.');
{$Else}
WriteLn(NbArcFound:4,' archive'+c+' trouvée'+c+'.');
{$Endif}
End else Begin
if NumD>0 then
Begin
if NumD>1 then c:='s' else c:='';
if TotDskR>0 then Begin Str(TotDskR div 1024,s); s:='('+s+' '+MotKo+')'; End
else s:='';
{$IfDef English}
WriteLn(NumD:4,' ',Justify('file'+c+' on disk',23),TotDsk:8,' bytes ',s);
{$Else}
WriteLn(NumD:4,' ',Justify('fichier'+c+' sur le disque',23),TotDsk:8,' oct ',s);
{$Endif}
End;
if NumA>0 then
Begin
if NumA>1 then c:='s' else c:='';
if TotArcR>0 then Begin Str(TotArcR div 1024,s); s:=Justify('('+s+' '+motKo+')',10); End
else s:=' ';
{$IfDef English}
Write(NumA:4,' ',Justify('archived file'+c,23),TotArc:8,' bytes ',s,' ');
{$Else}
Write(NumA:4,' ',Justify('fichier'+c+' archivé'+c,23),TotArc:8,' oct ',s,' ');
{$endif}
if NbArch=1 then c:='' else c:='s';
Write(NbArch,' archive'+c);
WriteLn;
End;
End;
if not ArchivesSeules then if not ((NumD<>0) xor (NumA<>0)) then
Begin
if TotalFound=0 then {$IfDef English} WriteLn('No file found.') else
{$Else} WriteLn('Aucun fichier trouvé.') else {$Endif}
Begin
if TotalFound=1 then c:='' else c:='s';
{$IfDef English}
Write(TotalFound:4,' ',Justify('file'+c+' found'+c,23));
{$Else}
Write(TotalFound:4,' ',Justify('fichier'+c+' trouvé'+c,23));
{$Endif}
if AffTotaux then
Begin
if TotDskR+TotArcR>0
then Begin Str((TotDskR+TotArcR) div 1024,s); s:='('+s+' '+motKo+')'; End
else s:='';
{$IfDef English}
WriteLn(TotDsk+TotArc:8,' bytes ',s);
{$Else}
WriteLn(TotDsk+TotArc:8,' oct ',s);
{$Endif}
End;
WriteLn;
End;
End;
ChDir(RepOriginal); Close(CrtS); Dispose(Fichiers);
ExitProc:=KeepExit;
if PatcherIci='' then; {juste pour être dans le code de l'executable}
End;
Var Lec:Byte;
Begin
{$IfDef English}
WriteLn('Archive Finder 1.26 Jc Boggio/France Aug, 14 93 Public domain');
{$Else}
WriteLn('Archive Finder 1.26 Jc Boggio 14-Aoû-93 Domaine public');
{$Endif}
Redirige:=Redir;
LisParametres; WriteLn; Assign(OutPut,''); ReWrite(OutPut);
AssignCrt(CrtS); ReWrite(CrtS); TotalFound:=0; New(Fichiers);
TotDsk:=0; TotDskR:=0; TotArc:=0; TotArcR:=0; NumA:=0; NumD:=0; NbArcFound:=0;
NbArch:=0; GetDir(0,RepOriginal); KeepExit:=ExitProc; ExitProc:=@MyExitProc;
if Pos(':',DefRep)<>0 then Cherche(DefRep)
else For Lec:=1 to Length(Lecteurs) do
Begin
Pile:=0; {Normalement inutile}
Cherche(Lecteurs[Lec]+':'+DefRep);
End;
End.
- 1.00 Première version.
Scrute les .LZH, les .ARJ, les .ZIP et les .ARC
- 1.01 Ajout des paramètres /S et /C
- 1.02 Ajout des fichiers .PAK
Accélération de la recherche (50% plus rapide en moyenne, très efficace
sur les grosses archives (utilisation du Seek, merci Etche)).
Gère la redirection.
Ajout du /E /M /A et /N
Amélioration de la recherche par défaut
- 1.03 Suppression du bug lorsqu'aucun paramètre n'est spécifié
Possibilité de remplacer le '/' par un '-'
Ajout du /G /P et /R
Modification du /S
- 1.04 Ajout des .ZOO (Merci Mr Burns (l'auteur de PibCat))
Ajout du /W (merci Mr Buerg (l'auteur de FV entre autres))
- 1.05 Correction de l'affichage lors d'un /G seul (sans /P)
- 1.06 Ajout de totaux sur les archives
Ajout de quelques ProcessKey pour mieux gérer <Espace>, <Ctrl-C> et <Esc>
Amélioration du /C : si un répertoire par défaut est précisé on
remplace le /C par un /S
Amélioration du /M : si le masque d'archives est précédé d'un chemin,
celui-ci est placé dans le /R
Suppression des '\' final dans les noms de répertoire (c'est plus beau)
possibilité de regrouper les paramètres (af -gp par exemple)
possibilité de spécifier la valeur + ou - d'un paramètre (af -G+S-)
Ajout de certains .SIT (très incertain !)
- 1.07 Modification mineure du /M pour raison de commodité
Ajout du /T et /F
- 1.08 Ajout du /U et du /#
Modification du /E pour inclure l'écriture des répertoires
Réparation du /R si rien n'est précisé.
Multiples modifications dans l'affichage en particulier pour la
gestion de la redirection.
- 1.09 Accélération des recherches de 28%. Quand on voit la vitesse de
"Supersonic Search Tools" on prend peur...
- 1.10 Accélération des recherches avec la recherche supersonique. 43% par
rapport à la version 1.08
Ajout du /B
- 1.11 La recherche supersonique ne pouvant chercher qu'à partir du
répertoire \ et posant un problème avec le dos 4.01, elle est
laissée de côté pour le moment.
Remis en place l'usage de ProcessKey
- 1.12 Suppression définitive de la recherche supersonique.
Suppression du /B
Amélioration de la vitesse de 20%
- 1.13 Ajout de la recherche ultra rapide utilisée par SST (l'ex référence)
qui peut ne chercher que les répertoires *.
Ici, cette fonction n'est utile qu'en conjonction avec -g et -p
(recherche globale, pas dans les archives). Mais elle est TRES utile.
SST est dépassé. Essayez AF -GP* *.ZZZ
Ajout du /*
- 1.14 Ajout des masques étendus de 4DOS ! (AF *A*F*.*)
- 1.15 Ajout de la recherche sur la date et la taille
Ajout du /D et /I
- 1.16 Correction du bug en cas de tentative d'accès à une archive ReadOnly
{Fin de la doc}
- 1.17 Correction mineure pour l'affichage des archives seules >= 10Mo.
Multi masques !!! (AF *.Zip *.doc *.pas ...)
Possibilité de lancer : AF \dos\*.com -gp
A ce stade, on ne peut plus comparer les performances avec les
autres produits (Multi masques + masques étendus)
- 1.18 Compatibilité avec MsDos 5.0 : modification de "ClusterSize".
Gère la nouvelle méthode de compression de PkZip "Extra". Bof...
- 1.19 Correction mineure pour l'affichage /Wide
Ajout du /L
Pile économisée pendant la recherche des fichiers du disque
Ajout du /B (pas la recherche supersonique mais le "Bel affichage")
Modifications diverses d'affichage des totaux.
/F détermine à présent si il faut afficher les totaux.
/G est désormais par défaut sur + !!!
Une seule diffusion
- 1.20 Encore quelques corrections et large diffusion
- 1.21 Ajout des fichiers TPZ de Patrick TEIL (merci à lui)
Amélioration de ProcessKey
Léger changement de look pour le contenu des archives
Améliorations de Check. Gains de vitesse.
Ajout de l'option /) pour VOIR ce que l'on cherche à faire et
trouver une erreur
- 1.22 Les fichiers .A00 à .A99 sont considérés comme des archives ARJ
La recherche de fichier dans une archive ne prend plus en compte
le sous-répertoire dans lequel se trouve le fichier (jusque là,
pour trouver le fichier UTIL\FICHIER.EXT, AF FICHIER* ne
fonctionnait pas. Il fallait faire AF *FICHIER*
La recherche accepte désormais les masques terminés par un . utile si
l'on cherche les fichiers ne portant pas d'extension.
- 1.23 Debug du -m qui acceptait mal les -mb:xxx
Les options /L /M et /R sont correctement affichées par l'option -)
Modifications du /a en combinaison avec un masque de fichiers et
combinaison avec /f et /n.
TRES UTILE notamment pour :
AF -AN TEASER.COM >FIC
For %a in (@FIC) do Arj d %a teaser.com
Ce petit Alias/Batch pour 4Dos fait chercher à AF toutes les
archives contenant le fichier TEASER.COM et range cette liste
dans FIC. Il ne reste plus qu'à dire à 4Dos de lire ce fichier
FIC et pour chaque nom d'archive de supprimer le fichier en question.
Correction sur le -C qui désormais fait un -L0 automatiquement
- 1.24 Création de la version en langue anglaise (non diffusée)
- 1.25 Corrections diverses langue anglaise
Meilleure gestion des "garbages" à la fin des .LZH
Changement de nom de la méthode de compactage "Deflat" pour PkZip
(anciennement "Extra compression")
- 1.26 Suppression de problèmes de mémoire (RunTime Error 201)
Support des Auto-extractibles LZH et ARJ
Pseudo CAT sur 3614/3615 DP
Compuserve ID: 100117,3213
Je cherche les formats de tous les Headers des .SIT (les vieux et les
nouveaux !) ainsi que des .CPT
Si vous avez des idées d'options à rajouter, je suis ouvert,
n'hésitez surtout pas !