Suite a une conversation, il y a quelques jours sur la possibilité d'avoir des fichiers en accès direct en PB
Voici un PBI avec toutes les fonctions pour des fichiers textes a accès direct.
Volontairement j'ai limité les possibilités a 65000 champs de 5000 octets, ce qui a mon sens correspond a 90 % des utilisations de ce type de fichier.
Ensuite une base de données sera la bien venue.
Il n'y a aucune API, donc utilisable sur toutes les plateformes. Seulement 120 lignes de code environs seront compilées.
Il est possible qu'un Bug subsiste malgré les tests. Faites le moi savoir.
Il y a surement mieux. Faites des propositions.
A compiler en Pbi sous Filefcf.pbi
Code : Tout sélectionner
;Fichier texte a accés direct(ou a champs fixe) <.fcf>
;MLD le 5/11/2017: compilation PB6.61
;Compilez ce fichier sous Filefcf.pbi *********
;Ce fichier est libre de droits. Vous pouver l'utiliser, le copier, ou en faire une UserLib
;******** fonctions ********
;1) Création du fichier = CreateFilefcf(#fichier,NomFichier$,NombreChamps.l,LongeurChamp.l)
; Le nom de fichier sera sans extention. (Ce sera mis automatiquement).Si le fichier existe déjà, il sera remplacé par un fichier vide !
; Le nombre de champs maximum est de 65000 la longueur de champs est au maximum de 5000 octets
; Le nombre de champs est au minimum de 1, la longueur des champs est au minimum de 1 oct)
; Selon les supports de stockage l'opération peut durer assez longtemps
;
;2)OpenFilefcf(#fichier,NomFichier$) Ouverture du fichier pour des opérations de lecture/écriture. ATTENTION contrairement a PB le fichier
; n'est pas créer s'il n'existe pas. Le nom de fichier sera sans extention (Ce sera mis automatiquement).
;
;3)Obtenir le nombre de champs d'un fichier = Lnbch(#fichier) (Resultat.l = Lnbch(#fichier).ATTENTION avant l'utilisation de cette fonction
; le fichier doit être ouvert avec OpenFilefcf(#fichier,NomFichier$)
;
;4)Obtenir la longueur d'un champ = Llgch(#fichier)(Resultat.l = Llgch(#fichier).ATTENTION avant l'utilisation de cette fonction
; le fichier doit être ouvert avec OpenFilefcf(#fichier,NomFichier$)
;
;5)Lire un des champs = Lectchamp(#fichier,Numchamp.l(Resultat$ = Lectchamp(#fichier,Numchamp.l).ATTENTION avant l'utilisation de cette fonction
; le fichier doit être ouvert avec OpenFilefcf(#fichier,NomFichier$)
;
;6)Ecriture dans un des champs Ecritchamp(#fichier,Numchamp.l,Txt$):ATTENTION avant l'utilisation de cette fonction le fichier doit être ouvert
; avec OpenFilefcf(#fichier,NomFichier$)
;
;7)Ajoute un nouveau champ a la fin du fichier Ajchp(#fichier,NomFichier$,nombredechamp.l):Le nom du fichier sera sans extention
; (Ce sera mis automatiquement):ATTENTION avant l'utilisation de cette fonction le fichier doit être ouvert avec OpenFilefcf(#fichier,NomFichier$)
;
;8)Supprime un champ Supchp(#fichier,NomFichier$,Numchamp.l):ATTENTION les informations du champ supprimé seront perdus.Le nom de fichier
;sera sans extention (elle sera mis automatiquement).
;
;9)Augmente la longueur des champs Augchp(#fichier,NomFichier$,LongeurChamp.l);ATTENTION La longueur des champs doit impérativement
; être supérieure a celle définie par CreateFilefcf(#fichier,NomFichier$,NombreChamps.l,LongeurChamp.l):Le nom de fichier sera sans extention
; (Ce sera mis automatiquement).
;
;10)Obtenir la longueur du fichier FileSizefcf(#fichier)
;
;11) Supprimer du disque le fichier: DeleteFilefcf(#fichier)
;
;12) Ferme un fichier ouvert avec OpenFilefcf:CloseFile(#fichier)
Declare CreateFilefcf(Numfich,Nmf$,Nbchp.l,Lchp.l)
Declare OpenFilefcf(Numfich,Nmf$):Declare verif_ouv(Numfich):Declare secu(num.w)
Declare Lnbch(Numfich):Declare Llgch(Numfich):Declare.s Lectchamp(Numfich,Numch.l):Declare FileSizefcf(Nmf$)
Procedure secu(num.w)
Select num
Case 1
txtsecu$ = "Il manque l'emplacement et le nom du fichier"
Case 2
txtsecu$ = "Il y a un problème avec le nombre de champs ou la longueur"
Case 3
txtsecu$ = "le fichier indiqué n'existe pas ou n'est pas ouvert"
Case 4
txtsecu$ = "Le texte est trop long pour la largeur du champ"
Case 5
txtsecu$ = "La largeur des champs ne peut être inférieur a celle existante"
EndSelect
Debug txtsecu$
EndProcedure
Procedure verif_ouv(Numfich);vérif que le fichier est ouvert
If IsFile(Numfich)=0:secu(3):ProcedureReturn Null:EndIf
EndProcedure
Procedure Lnbch(Numfich);lecture du nombre de champs
verif_ouv(Numfich)
FileSeek(Numfich,0)
ProcedureReturn Val(Trim(StringField(ReadString(Numfich,#PB_File_IgnoreEOL,14),1,",")))
EndProcedure
Procedure Llgch(Numfich);lecture de la longueur d'un champ
verif_ouv(Numfich)
FileSeek(Numfich,0)
ProcedureReturn Val(Trim(StringField(ReadString(Numfich,#PB_File_IgnoreEOL,14),2,",")))
EndProcedure
Procedure CreateFilefcf(Numfich,Nmf$,Nbchp.l,Lchp.l);création du fichier
If Nmf$ = "":secu(1):ProcedureReturn Null:EndIf
If Nbchp.l > 65000 Or Nbchp.l = 0:secu(2):ProcedureReturn Null:EndIf
If Lchp.l > 5000 Or Lchp.l = 0:secu(2):ProcedureReturn Null:EndIf
CreateFile(Numfich,Nmf$ +".fcf")
longfich.q = 15 + (Nbchp.l*Lchp.l)
WriteString(Numfich,Space(longfich.q));remplis les champs
FileSeek(Numfich,0)
Ett$ = Str(Nbchp.l)+","+ Str(Lchp.l)
lEtt= Len(Ett$):Ett$ = Ett$ + Space(15-lEtt);***
WriteString(Numfich,Ett$);ecrit l'entête
CloseFile(Numfich)
EndProcedure
Procedure OpenFilefcf(Numfich,Nmf$);ouverture du fichier
If ReadFile(Numfich,Nmf$ +".fcf")= 0:secu(3):ProcedureReturn Null:EndIf;vérif que le fichier existe
CloseFile(Numfich)
OpenFile(Numfich,Nmf$ +".fcf")
EndProcedure
Procedure.s Lectchamp(Numfich,Numch.l);lecture d'un champ
verif_ouv(Numfich):If Numch.l > Lnbch(Numfich)Or Numch.l = 0:secu(2):ProcedureReturn "":EndIf
lgch.l = Llgch(Numfich)
FileSeek(Numfich,((15) + ((lgch.l+1)*Numch.l))- lgch.l);*************
ProcedureReturn Trim(ReadString(Numfich,#PB_File_IgnoreEOL,lgch.l))
EndProcedure
Procedure Ecritchamp(Numfich,Numch.l,Txt$);Ecriture dans un champ
verif_ouv(Numfich):If Numch.l > Lnbch(Numfich)Or Numch.l = 0:secu(2):ProcedureReturn Null:EndIf
If Len(Txt$) > Llgch(Numfich):secu(4):ProcedureReturn Null:EndIf
lgch.l = Llgch(Numfich):ltxt.l = Len(Txt$)
If ltxt.l < lgch.l:Txt$ = Txt$ + Space(lgch.l - ltxt.l):EndIf
FileSeek(Numfich,((15) + ((lgch.l+1)*Numch.l))- lgch.l);***
WriteString(Numfich,Txt$)
EndProcedure
Procedure Supchp(Numfich,Nmf$,Numchp.l);Supprime un champ
OpenFilefcf(Numfich,Nmf$)
nbchp.l = Lnbch(Numfich):lgch.l = Llgch(Numfich)
Dim tabp.s(nbchp.l-1):y.l = 0
For x = 1 To nbchp.l
If x <> Numchp.l
y.l = y.l +1
tabp.s(y) = Lectchamp(Numfich,x)
EndIf
Next
CloseFile(Numfich)
CreateFilefcf(Numfich,Nmf$,Nbchp.l-1,lgch.l)
OpenFilefcf(Numfich,Nmf$)
nbchp.l = Lnbch(Numfich)
For x = 1 To nbchp.l
Ecritchamp(Numfich,x,tabp.s(x))
Next
FreeArray(tabp.s())
EndProcedure
Procedure Ajchp(Numfich,Nmf$,pluschp.l);ajoute des champs
lgch.l = Llgch(Numfich)
longf.q = FileSize(Nmf$ + ".fcf")
FileSeek(Numfich,longf.q)
WriteString(Numfich,Space(pluschp.l*lgch.l))
Ett$ = Str(Lnbch(Numfich)+ pluschp.l)+","+ Str(Llgch(Numfich))
lEtt= Len(Ett$):Ett$ = Ett$ + Space(15-lEtt)
FileSeek(Numfich,0)
WriteString(Numfich,Ett$);ecrit l'entête
EndProcedure
Procedure Augchp(Numfich,Nmf$,Longchp.l);augmente la longueur des champs
OpenFilefcf(Numfich,Nmf$)
nbchp.l = Lnbch(Numfich):lgch.l = Llgch(Numfich)
If Longchp.l < lgch.l :secu(5):ProcedureReturn Null:EndIf
Dim tabp.s(nbchp.l)
For x = 1 To nbchp.l
tabp.s(x) = Lectchamp(Numfich,x)
Next
CloseFile(Numfich)
CreateFilefcf(Numfich,Nmf$,Nbchp.l,Longchp.l)
OpenFilefcf(Numfich,Nmf$)
For x = 1 To nbchp.l
Ecritchamp(1,x,tabp.s(x))
Next
FreeArray(tabp.s())
EndProcedure
Procedure FileSizefcf(Nmf$)
ProcedureReturn FileSize(Nmf$ + ".fcf")
EndProcedure
Procedure DeleteFilefcf(Nmf$)
DeleteFile(Nmf$ + ".fcf",#PB_FileSystem_Force)
EndProcedure
Code : Tout sélectionner
;MLD le 5/11/2017
XIncludeFile "Filefcf.pbi"
#Numfich = 1
;Teste les fonctionnalitées
;les fonctions sont a décocher selon les besoins
;¤¤¤¤¤¤ création du fichier ¤¤¤¤¤¤
;CreateFilefcf(1,"essaifcf",10,50);10 champs de 50 caractères ou octets
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;¤¤¤¤¤ Supprime un champ ¤¤¤¤¤
; OpenFilefcf(#Numfich,"essaifcf")
; Supchp(#Numfich,"essaifcf",2)
; CloseFile(#Numfich)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;¤¤¤¤¤ Ajoute champs ¤¤¤¤¤
; OpenFilefcf(#Numfich,"essaifcf")
; Ajchp(#Numfich,"essaifcf",2)
; CloseFile(#Numfich)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;¤¤¤¤¤ Ecritures dans un champ ¤¤¤¤¤
; OpenFilefcf(#Numfich,"essaifcf")
; ;Ecritchamp(#Numfich,1,"Fichier a accès direct 1")
; For x = 1 To 10
; Ecritchamp(#Numfich,x,"Fichier a accès direct " + Str(x))
; Next
; CloseFile(#Numfich)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;¤¤¤¤¤ Augmente la longueur des champs ¤¤¤¤¤
;Augchp(1,"essaifcf",55)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;¤¤¤¤¤ Lecture du nombre de champs et longueur des champs ¤¤¤¤¤
; OpenFilefcf(1,"essaifcf")
; Debug Lnbch(#Numfich)
; Debug Llgch(#Numfich)
; CloseFile(#Numfich)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;¤¤¤¤¤ Lecture des champs ¤¤¤¤¤
; OpenFilefcf(1,"essaifcf")
; For x =1 To Lnbch(1)
; Debug Lectchamp(1,x)
; Next
; CloseFile(#Numfich)
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;¤¤¤¤¤ Longueur du fichier ¤¤¤¤¤
;Debug Len("Fichier a accès direct 1xxxxxxxxxxxxxxxxxxxxxxxxxy") Debug FileSizefcf("essaifcf")
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;¤¤¤¤¤ Supprime le fichier ¤¤¤¤¤
;DeleteFilefcf("essaifcf")
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤