home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
pas
/
ktools
/
source
/
ofile.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-10-31
|
14KB
|
424 lines
Unit OFile;
{ Objet fichier géré directement par appel aux fonctions DOS. }
{ En cas d'erreur, aucune opération ne peut plus être réalisée. }
{ De nombreux messages d'erreurs permettent de comprendre l'erreur. }
{ Kostrzewa Bruno }
{ septembre 1994 }
{$IFDEF debug}
{$A+,B-,D+,E-,F-,I+,L+,N-,R+,S+,V-,W+,X+}
{$ELSE}
{$A+,B-,D-,E-,F-,I+,L-,N-,R-,S-,V-,W+,X+}
{$ENDIF}
INTERFACE
Uses Dos; { pour la gestion des noms de fichier et les appels aux
interruptions }
Const
{ modes d'ouverture des fichiers }
stCreate = $0001; { créer un nouveau fichier en écrasant si nécessaire
un fichier existant }
stOpen = $0002; { ouvrir un fichier existant }
{ modes de déplacements dans le fichier }
dpDebut = 0;
dpCourant = 1;
dpFin = 2;
{ constante indiquant qu'aucun Handle n'est attribué au fichier }
NoHandle = $FFFF;
Type
PFile=^TFile;
TFile=object
Handle : Word; { Handle du DOS }
ErrorFlag : Word; { Numéro d'erreur DOS }
FDir : DirStr; { Chemin d'accès au fichier }
FName : NameStr; { Nom du fichier }
FExt : ExtStr; { Extension du fichier }
Constructor Init(Nom:String; Acces:Word);
{ ouverture du fichier }
Destructor Done;virtual;
{ fermeture du fichier }
Procedure FOpen;
{ ouverture d'un fichier existant }
Procedure FCreate;
{ création d'un fichier }
Procedure FClose;
{ fermeture du fichier }
Procedure FTruncate;
{ termine le fichier à la position actuelle du pointeur }
Procedure FWriteC(Var Buf; Taille:Word; Var Res:Word);
{ écriture dans le fichier avec retour du nombre d'octets écrits }
Procedure FWrite(Var Buf; Taille:Word); virtual;
{ écriture dans le fichier }
Procedure FReadC(Var Buf; Taille:Word; Var Res:Word);
{ lecture dans le fichier avec retour du nombre d'octets lus }
Procedure FRead(Var Buf; Taille:Word); virtual;
{ lecture du fichier }
Procedure FSeekRel(Depl:LongInt; Mode:Byte);
{ déplacement dans le fichier à partir:
du début pour Mode=dpDebut
de la position courante pour Mode=dpCourant
de la fin pour Mode=dpFin }
Procedure FSeek(Depl:LongInt);
{ déplacement dans le fichier à partir du début }
Function FSize:LongInt;
{ taille du fichier sur disque }
Function FPosit:LongInt;
{ position actuelle dans le fichier }
Function IsValid:Boolean; virtual;
{ test d'erreur }
Function GetErrorMsg:String; virtual;
{ renvoie un éventuel message d'erreur }
End;
IMPLEMENTATION
Type
{ pour le passage des entiers longs aux double-mots }
LongRec = record
Faible : Word;
Fort : Word;
End;
Var Regs:Registers;
Function GetDosErrorMsg(code:Word):String;
{ interprétation des codes d'erreur du DOS }
Begin
case code of
{ 00 pas d'erreur }
$00 : GetDosErrorMsg:='';
{ 01 le numéro de la fonction ou de la sous fonction de l'interruption
n'est pas valide }
$01 : GetDosErrorMsg:='Numéro de fonction invalide.';
{ 02 le fichier cherché n'a pas été trouvé dans le répertoire spécifié }
$02 : GetDosErrorMsg:='Fichier non trouvé.';
{ 03 le répertoire spécifié n'a pas été trouvé }
$03 : GetDosErrorMsg:='Chemin non trouvé.';
{ 04 trop de fichiers ouverts car un programme ne dispose que de 20 handles }
$04 : GetDosErrorMsg:='Trop de fichiers ouverts.';
{ 05 accès au fichier refusé, par exemple pour écriture sur fichier en
lecture seule }
$05 : GetDosErrorMsg:='Accès refusé.';
{ 06 le handle spécifié ne correspond pas à un fichier ouvert }
$06 : GetDosErrorMsg:='Handle incorrect.';
{ 07 problème avec la mémoire }
$07 : GetDosErrorMsg:='Bloc de contrôle mémoire détruit.';
{ 08 mémoire insuffisante, par exemple pour exécuter un programme fils }
$08 : GetDosErrorMsg:='Mémoire insuffisante.';
{ 09 problème avec la mémoire }
$09 : GetDosErrorMsg:='Adresse de zone incorrecte.';
{ 10 mauvais environnement }
$0A : GetDosErrorMsg:='Mauvais environnement.';
{ 11 format invalide des données }
$0B : GetDosErrorMsg:='Format incorrect.';
{ 12 code d'accès incorrect, par exemple écrire dans un fichier ouvert
en lecture }
$0C : GetDosErrorMsg:='Code d''accès incorrect.';
{ 13 donnée incorrecte }
$0D : GetDosErrorMsg:='Donnée incorrecte.';
{ 14 réservé }
{ 15 mauvais numéro de lecteur }
$0F : GetDosErrorMsg:='Référence de disque incorrecte.';
{ 16 suicide interdit }
$10 : GetDosErrorMsg:='Tentative de destruction du répertoire courant.';
{ 17 périphériques différents quand on essaie de renommer }
$11 : GetDosErrorMsg:='Périphériques différents.';
{ 18 plus de fichiers lors d'une recherche }
$12 : GetDosErrorMsg:='Plus de fichiers.';
{ 19 il faut enlever la protection en écriture de la disquette ! }
$13 : GetDosErrorMsg:='Disque protégé contre l''écriture.';
{ 20 unité non reconnue par le système }
$14 : GetDosErrorMsg:='Unité inconnue.';
{ 21 introduire une disquette dans le lecteur ou fermer la porte }
$15 : GetDosErrorMsg:='Disque pas prêt.';
{ 22 problème de matériel }
$16 : GetDosErrorMsg:='Commande incorrecte.';
{ 23 problème de matériel }
$17 : GetDosErrorMsg:='Erreur de mémoire.';
{ 24 problème de matériel }
$18 : GetDosErrorMsg:='Longueur de structure incorrecte.';
{ 25 problème de matériel }
$19 : GetDosErrorMsg:='Erreur de positionnement du pointeur de fichier.';
{ 26 type de support magnétique inconnu }
$1A : GetDosErrorMsg:='Disque non formaté.';
{ 27 problème de matériel }
$1B : GetDosErrorMsg:='Secteur non trouvé.';
{ 28 erreur d'imprimante }
$1C : GetDosErrorMsg:='Plus de papier dans l''imprimante.';
{ 29 problème de matériel }
$1D : GetDosErrorMsg:='Erreur d''écriture.';
{ 30 problème de matériel }
$1E : GetDosErrorMsg:='Erreur de lecture.';
{ 31 problème matériel }
$1F : GetDosErrorMsg:='Erreur liée au matériel.';
else GetDosErrorMsg:='Erreur non répertoriée.'
end;
End;
{ Objet TFile }
Constructor TFile.Init(Nom:String; Acces:Word);
Var P : PathStr;
i : Integer;
S : SearchRec;
Begin
ErrorFlag:=0;
Handle:=NoHandle;
{ retrouver le nom complet et le mettre en majuscules }
P:=FExpand(Nom);
for i:=1 to length(P) do P[i]:=UpCase(P[i]);
{ conserver les parties séparées }
FSplit(P,FDir,FName,FExt);
{ ouverture du fichier }
case Acces of
stCreate : FCreate;
stOpen : FOpen;
end;
End;
Destructor TFile.Done;
{ on ferme le fichier }
Begin
FClose;
End;
Procedure TFile.FOpen;
Var P : PathStr;
Begin
if Handle<>NoHandle { fichier déjà ouvert }
then begin
FClose;
if not IsValid then exit;
end;
P:=FDir+FName+FExt+#0; { Chaîne à 0 terminal pour DOS }
Regs.AH:=$3D; { Ouvrir fichier existant }
Regs.AL:=2; { Mode d'accès : Lit/Ecrit }
Regs.DS:=Seg(P[1]); { Adresse du nom ASCII-Z }
Regs.DX:=Ofs(P[1]);
Intr($21,Regs); { Invoque le DOS }
if (Regs.Flags and FCarry)<>0 { Test d'erreur DOS }
then ErrorFlag:=Regs.AX
else Handle:=Regs.AX; { Recupère le Handle du fichier }
End;
Procedure TFile.FCreate;
Var P : PathStr;
Begin
if Handle<>NoHandle { fichier déjà ouvert }
then begin
FClose;
if not IsValid then exit;
end;
P:=FDir+FName+FExt+#0;
Regs.AH:=$3C; { Créer ou vider fichier }
Regs.CX:=0; { Attribut fichier : fichier normal }
Regs.DS:=Seg(P[1]); { Adresse du nom ASCII-Z }
Regs.DX:=Ofs(P[1]);
Intr($21,Regs); { Invoque le DOS }
if (Regs.Flags and FCarry)<>0 { Test d'erreur DOS }
then ErrorFlag:=Regs.AX
else Handle:=Regs.AX; { Recupère le Handle du fichier }
End;
Procedure TFile.FClose;
Begin
if Handle=NoHandle then exit; { Fichier déjà fermé }
Regs.AH:=$3E; { Fonction : fermer le fichier }
Regs.BX:=Handle; { Donne le Handle du fichier }
Intr($21,Regs); { Invoque le DOS }
if (Regs.Flags and FCarry)<>0 { Test d'erreur }
then ErrorFlag:=Regs.AX;
Handle:=NoHandle; { Plus de handle pour le fichier }
End;
Procedure TFile.FTruncate;
Begin
if (ErrorFlag<>0) then Exit;
Regs.AH:=$40; { Ecrire dans fichier }
Regs.BX:=Handle; { Donne le Handle du fichier }
Regs.CX:=0; { Ecrire 0 octet=truncate }
Intr($21,Regs); { Invoque le DOS }
If (Regs.Flags and FCarry)<>0 { Test d'erreur DOS }
then ErrorFlag:=Regs.AX;
End;
Procedure TFile.FWriteC(Var Buf; Taille:Word; Var Res:Word);
{ écriture avec récupération du nombre d'octets écrits dans Res }
Begin
if (ErrorFlag<>0) or (Taille=0) then Exit;
Regs.AH:=$40; { Ecrire dans fichier }
Regs.BX:=Handle; { Donne le Handle du fichier }
Regs.CX:=Taille; { Nombre d'octets à écrire }
Regs.DS:=Seg(Buf); { Adresse de la destination }
Regs.DX:=Ofs(Buf);
Intr($21,Regs); { Invoque le DOS }
Res:=Regs.AX; { Nombre d'octets écrits }
If (Regs.Flags and FCarry)<>0 { Test d'erreur DOS }
then ErrorFlag:=Regs.AX;
End;
Procedure TFile.FWrite(Var Buf; Taille:Word);
{ écriture simple }
Begin
if ErrorFlag<>0 then Exit;
Regs.AH:=$40; { Ecrire dans fichier }
Regs.BX:=Handle; { Donne le Handle du fichier }
Regs.CX:=Taille; { Nombre d'octets à écrire }
Regs.DS:=Seg(Buf); { Adresse de la destination }
Regs.DX:=Ofs(Buf);
Intr($21,Regs); { Invoque le DOS }
If (Regs.Flags and FCarry)<>0 { Test d'erreur DOS }
then ErrorFlag:=Regs.AX;
End;
Procedure TFile.FReadC(Var Buf; Taille:Word; Var Res:Word);
{ lecture avec récupération du nombre d'octets lus }
Begin
if ErrorFlag<>0 then exit;
Regs.AH:=$3F; { Lire le fichier }
Regs.BX:=Handle; { Donne la Handle du fichier }
Regs.CX:=Taille; { Nombre d'octets à lire }
Regs.DS:=Seg(Buf); { Adresse de la destination }
Regs.DX:=Ofs(Buf);
Intr($21,Regs); { Invoque le DOS }
Res:=Regs.AX; { Nombre d'octets lus }
if (Regs.Flags and FCarry)<>0 { Test d'erreur DOS }
then ErrorFlag:=Regs.AX;
End;
Procedure TFile.FRead(Var Buf; Taille:Word);
{ lecture simple }
Begin
if ErrorFlag<>0 then exit;
Regs.AH:=$3F; { Lire le fichier }
Regs.BX:=Handle; { Donne le Handle du fichier }
Regs.CX:=Taille; { Nombre d'octets à lire }
Regs.DS:=Seg(Buf); { Adresse de la destination }
Regs.DX:=Ofs(Buf);
Intr($21,Regs); { Invoque le DOS }
if (Regs.Flags and FCarry)<>0 { Test d'erreur DOS }
then ErrorFlag:=Regs.AX;
End;
Procedure TFile.FSeekRel(Depl:LongInt; Mode:Byte);
{ déplacement relatif du pointeur }
Begin
if ErrorFlag<>0 then Exit;
Regs.AH:=$42; { Déplacement du pointeur }
Regs.AL:=Mode; { Mode de calcul du déplacement }
Regs.BX:=Handle; { Donne le handle du fichier }
Regs.CX:=LongRec(Depl).Fort; { Valeur du déplacement }
Regs.DX:=LongRec(Depl).Faible;
Intr($21,Regs); { Invoque le DOS }
if (Regs.Flags and FCarry)<>0 { Test d'erreur DOS }
then ErrorFlag:=Regs.AX;
End;
Procedure TFile.FSeek(Depl:LongInt);
{ positionnement à partir du début }
Begin
FSeekRel(Depl, dpDebut);
End;
Function TFile.FSize:LongInt;
{ calcul de la taille du fichier }
Var t,l:LongInt;
Begin
FSize:=0; { réponse par défaut }
if ErrorFlag<>0 then Exit;
t:=FPosit; { mémorise la position courante du pointeur }
if ErrorFlag<>0 then Exit;
{ se positionner en fin de fichier }
Regs.AH:=$42;
Regs.AL:=dpFin;
Regs.BX:=Handle;
Regs.CX:=0;
Regs.DX:=0;
Intr($21,Regs);
{ lire la position à partir du début }
LongRec(l).Fort:=Regs.DX;
LongRec(l).Faible:=Regs.AX;
{ test d'erreur DOS }
if (Regs.Flags and FCarry)<>0
then ErrorFlag:=Regs.AX
else begin
FSize:=l;
{ rétablir la position initiale }
FSeekRel(t,dpDebut);
end;
End;
Function TFile.FPosit:LongInt;
Var l:LongInt;
Begin
FPosit:=-1; { réponse par défaut }
if ErrorFlag<>0 then exit;
{ se positionner à la position courante }
Regs.AH:=$42;
Regs.AL:=dpCourant;
Regs.BX:=Handle;
Regs.CX:=0;
Regs.DX:=0;
Intr($21,Regs);
{ lire la position à partir du début }
LongRec(l).Fort:=Regs.DX;
LongRec(l).Faible:=Regs.AX;
{ test d'erreur DOS }
If (Regs.Flags and FCarry)<>0
then ErrorFlag:=Regs.AX
else FPosit:=l;
End;
Function TFile.IsValid:Boolean;
Begin
IsValid:=ErrorFlag=0;
End;
Function TFile.GetErrorMsg:String;
Begin
if ErrorFlag<>0
then GetErrorMsg:=FName+FExt+' : '+GetDosErrorMsg(ErrorFlag)
else GetErrorMsg:='';
End;
END.
{ Fin du fichier OFile.Pas }