home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / ktools / source / ofdirtab.pas < prev    next >
Pascal/Delphi Source File  |  1994-11-10  |  8KB  |  308 lines

  1. Unit OFDirTab;
  2. { Tableau contenant les fichiers d'un répertoire. }
  3. { Il s'agit d'un objet dérivé de l'objet TTabPtr défini dans l'unité
  4.   OTabPtr.Pas. On a donc un tableau de pointeurs, chacun d'entre eux
  5.   pointant sur un enregistrement de type SearchRec défini dans l'unité
  6.   DOS.}
  7.  
  8. { K.B. avril-novembre 1994 }
  9.  
  10. {$IFDEF debug}
  11.  {$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
  12. {$ELSE}
  13.  {$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
  14. {$ENDIF}
  15.  
  16. INTERFACE
  17.  
  18. Uses Dos,OTableau;
  19.  
  20. Const
  21.  erDir=5;
  22.  
  23. Type
  24.  { nom de fichier }
  25.  TStr12=String[12];
  26.  { informations fichier }
  27.  PSearchFileRec=^TSearchFileRec;
  28.  TSearchFileRec = record
  29.      Attr: Byte;
  30.      Time: Longint;
  31.      Size: Longint;
  32.      Name: TStr12;
  33.      end;
  34.  
  35.  { objet TFileTab; tableau des fichiers d'un répertoire }
  36.  PFileTab=^TFileTab;
  37.  TFileTab=object(TTabPtr)
  38.   Constructor Init(CheminMasque:PathStr);
  39.   { Le constructeur attend le nom du répertoire avec un éventuel
  40.     masque de sélection }
  41.   Function GetErrorMsg:String;virtual;
  42.   Procedure ReadDir;virtual;
  43.   { Lecture du contenu du répertoire }
  44.   Procedure ChangeDir(Chemin:PathStr);
  45.   { Changement de répertoire }
  46.   Function DonneRepertoire:PathStr;
  47.   { Renvoie le nom du répertoire }
  48.   Function DonneMasque:TStr12;
  49.   { Renvoie le masque de sélection }
  50.   Function Compare(i1,i2:Integer):Integer;virtual;
  51.   { Comparaison pour classement :
  52.     1) d'abord les sous répertoires dans l'ordre alphabétique
  53.     2) ensuite les fichiers dans l'ordre alphabétique }
  54.   Procedure Effacer(p:Pointer);virtual;
  55.   { Libération de la mémoire allouée à un pointeur sur enregistrement
  56.     de type SearchRec }
  57.   Function TailleTotale:LongInt;
  58.   { Taille totale des fichiers lus }
  59.   Private
  60.     Masque:TStr12;      { masque de sélection }
  61.     Repertoire:DirStr; { répertoire étudié }
  62.   End;
  63.  
  64.  { exemple d'objet dérivé qui ne lit que les sous répertoires }
  65.  PDirTab=^TDirTab;
  66.  TDirTab=object(TFileTab)
  67.   Constructor Init;
  68.   Procedure ReadDir;virtual;
  69.   End;
  70.  
  71.  { utilitaires pour obtenir le contenu d'un enregistrement de type
  72.    SearchRec }
  73.  Function NomFichier(P:PSearchFileRec):TStr12;
  74.  Function TailleFichier(P:PSearchFileRec):LongInt;
  75.  Function AttributFichier(P:PSearchFileRec):Word;
  76.  
  77. IMPLEMENTATION
  78.  
  79. Function NomFichier(P:PSearchFileRec):TStr12;
  80. Begin
  81.  NomFichier:=P^.Name;
  82. End;
  83.  
  84. Function TailleFichier(P:PSearchFileRec):LongInt;
  85. Begin
  86.  TailleFichier:=P^.Size;
  87. End;
  88.  
  89. Function AttributFichier(P:PSearchFileRec):Word;
  90. Begin
  91.  AttributFichier:=P^.Attr;
  92. End;
  93.  
  94. { objet TFileTab }
  95.  
  96. Constructor TFileTab.Init(CheminMasque:PathStr);
  97. Var Attr:Word;
  98.     Nom: NameStr;
  99.     Rep: DirStr;
  100.     E: ExtStr;
  101.     f: File;
  102.     FStr:PathStr;
  103. Begin
  104.  { constructeur hérité }
  105.  TTabPtr.Init(50,50);
  106.  { étude du paramètre }
  107.  FStr:=FExpand(CheminMasque);
  108.  if FStr[Length(FStr)]<>'\'
  109.  { ajouter le symbole / s'il s'agit d'un répertoire }
  110.     then begin
  111.           Assign(f,FStr);
  112.           GetFAttr(f,Attr);
  113.           if (DosError=0) and (Attr and Directory <> 0)
  114.              then FStr:=FStr + '\';
  115.          end;
  116.  FSplit(FStr,Rep,Nom,E);
  117.  { choix par défaut }
  118.  if Nom = '' then Nom := '*';
  119.  if E = '' then E := '.*';
  120.  { masque de sélection }
  121.  Masque:=Nom+E;
  122.  { répertoire de sélection }
  123.  Repertoire:=Rep;
  124.  { lecture du contenu }
  125.  ReadDir;
  126. End;
  127.  
  128. Procedure TFileTab.ReadDir;
  129. Var F: SearchRec;
  130.     P:PSearchFileRec;
  131. Begin
  132.  { effacer ce qui existe déjà }
  133.  if NombreItems<>0
  134.     then Vider;
  135.  { recherche des répertoires }
  136.  FindFirst(Repertoire+'*.*',Directory,F);
  137.  if (DosError=0) and (F.Name='.')
  138.     then FindNext(F);
  139.  While (DosError=0) and IsValid do
  140.   begin
  141.    if F.Attr and Directory <> 0
  142.       then begin
  143.             Getmem(P,SizeOf(TSearchFileRec));
  144.             if P<>nil
  145.                then begin
  146.                      move(F.Attr,P^,SizeOf(TSearchFileRec));
  147.                      Ajouter(P);
  148.                     end;
  149.            end;
  150.    FindNext(F);
  151.   end;
  152.  { recherche des fichiers }
  153.  FindFirst(Repertoire+Masque,AnyFile,F);
  154.  While (DosError=0) and IsValid do
  155.   begin
  156.    if F.Attr and Directory = 0
  157.       then begin
  158.             Getmem(P,SizeOf(TSearchFileRec));
  159.             if P<>nil
  160.                then begin
  161.                      move(F.Attr,P^,SizeOf(TSearchFileRec));
  162.                      Ajouter(P);
  163.                     end;
  164.            end;
  165.    FindNext(F);
  166.   end;
  167.  { classement }
  168.  Trier(true);
  169. End;
  170.  
  171. Procedure TFileTab.ChangeDir(Chemin:PathStr);
  172. Var FStr:PathStr;
  173.     Attr:Word;
  174.     f:File;
  175. Begin
  176.  FStr:=FExpand(Chemin);
  177.  { supprimer le symbole \ }
  178.  if FStr[length(FStr)]='\'
  179.     then dec(FStr[0]);
  180.  { vérifier qu'on a bien un répertoire }
  181.  if length(FStr)>2
  182.     then begin
  183.           Assign(f,FStr);
  184.           GetFAttr(f,Attr);
  185.           if (DosError=0) and (Attr and Directory <> 0)
  186.              then Repertoire:=FStr + '\'   { tout va bien }
  187.              else begin
  188.                    ErrorFlag:=erDir;
  189.                    exit;
  190.                   end;
  191.          end
  192.     else Repertoire:=FStr+'\';
  193.  { lecture du contenu du répertoire }
  194.  ReadDir;
  195. End;
  196.  
  197. Function TFileTab.GetErrorMsg:String;
  198. Begin
  199.  case ErrorFlag of
  200.   erDir : GetErrorMsg:= 'Répertoire non valide.';
  201.   else GetErrorMsg:=TTableau.GetErrorMsg;
  202.   end;
  203. End;
  204.  
  205. Function TFileTab.DonneRepertoire:PathStr;
  206. Begin
  207.  DonneRepertoire:=Repertoire;
  208. End;
  209.  
  210. Function TFileTab.DonneMasque:TStr12;
  211. Begin
  212.  DonneMasque:=Masque;
  213. End;
  214.  
  215. Function TFileTab.Compare(i1,i2:Integer):Integer;
  216. Var nd1,nd2:TStr12;
  217.     attr1,attr2:Word;
  218.     p1,p2:PSearchFileRec;
  219. Begin
  220.  Lire(p1,i1);
  221.  Lire(p2,i2);
  222.  { classer les répertoires avant les fichiers }
  223.  attr1:=AttributFichier(P1);
  224.  attr2:=AttributFichier(P2);
  225.  if attr1 and Directory <> 0
  226.     then begin
  227.           if attr2 and Directory = 0
  228.              then begin
  229.                    compare:=-1;
  230.                    exit;
  231.                   end;
  232.          end
  233.     else begin
  234.           if attr2 and Directory <> 0
  235.              then begin
  236.                    compare:=1;
  237.                    exit;
  238.                   end;
  239.          end;
  240.  { classer par ordre alphabétique }
  241.  nd1:=NomFichier(P1);
  242.  nd2:=NomFichier(P2);
  243.  if nd1<nd2
  244.     then compare:=-1
  245.     else compare:=1;
  246. End;
  247.  
  248. Procedure TFileTab.Effacer(p:Pointer);
  249. Begin
  250.  { libérer la mémoire allouée à un pointeur sur un enregistrement
  251.    du type TSearchFileRec }
  252.  if p<>nil
  253.     then FreeMem(P,SizeOf(TSearchFileRec));
  254. End;
  255.  
  256. Function TFileTab.TailleTotale:LongInt;
  257. Var r:LongInt;
  258.     n:Integer;
  259.     p:PSearchFileRec;
  260. Begin
  261.  r:=0;
  262.  if NombreItems>0
  263.     then For n:=1 to NombreItems do
  264.           begin
  265.            Lire(p,n);
  266.            r:=r+TailleFichier(p);
  267.           end;
  268.  TailleTotale:=r;
  269. End;
  270.  
  271. { objet TDirTab }
  272. { ne lit que les sous répertoires }
  273. Constructor TDirTab.Init;
  274. Begin
  275.  TFileTab.Init('*.*');
  276. End;
  277.  
  278. Procedure TDirTab.ReadDir;
  279. { procédure virtuelle redéfinie pour ne lire que les sous répertoires }
  280. Var F: SearchRec;
  281.     P:PSearchFileRec;
  282. Begin
  283.  if NombreItems<>0
  284.     then Vider;
  285.  {recherche des sous répertoires}
  286.  FindFirst(Repertoire+'*.*',Directory,F);
  287.  if (DosError=0) and (F.Name='.')
  288.     then FindNext(F);
  289.  While (DosError=0) and IsValid do
  290.   begin
  291.    if F.Attr and directory <>0
  292.       then begin
  293.             Getmem(P,SizeOf(TSearchFileRec));
  294.             if P<>nil
  295.                then begin
  296.                      move(F.Attr,P^,SizeOf(TSearchFileRec));
  297.                      Ajouter(P);
  298.                     end;
  299.            end;
  300.    FindNext(F);
  301.   end;
  302.  Trier(true);
  303. End;
  304.  
  305. END.
  306.  
  307. {                         Fin du fichier OFDirTab.Pas                       }
  308.