Supprimer un enregistrement d'un fichier texte sans créer un temporérement

EMSIEN Messages postés 194 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 11 juin 2009 - 6 mai 2005 à 17:53
EMSIEN Messages postés 194 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 11 juin 2009 - 8 mai 2005 à 01:57
salut à tous les codeurs,
voila je cherche une méthode pour pouvoir supprimer un enregistrement sans avoir recours à la création d'un fichier temporaire puis copié tous les enregistrements sauf celui que je veux supprimer,puis renomer le temporaire et effacer l'original.
j'ai effectué un décalage en écrasant l'enregistrement à effacer mais le dernier enregistrement contient encore le vide " " je veux asvoir est ce qu'il ya moyen de tronquer le fichier par exemple comme le pascal avec trancate(file) ou à l'aide d'API (pas setendoffile qui déplace slmnt le end of file sans tronquer) ou avec n'importe quelle méthode.
merci encore pour vos remarques et réponses.
je ss connecté sur [mailto:shkaff@hotmail.com shkaff@hotmail.com]

6 réponses

cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
6 mai 2005 à 20:00
Salut,

Je crains que la meilleure solution soit de réécrire le fichier. Soit par la méthode que tu as décrite en 1er lieu soit par celle-ci, si ton fichier n'est pas trop énorme :

Dim nf1 As Integer, nf2 As Integer
Dim str As String

'tu récupères ton fichier texte en entier dans str
nf1 = FreeFile
Open "c:\temp\essai.txt" For Input As #nf1
str = Input(LOF(nf1), #nf1)
Close #nf1

'si tes enregs sont séparés par des CrLf
'tu remplaces l'enreg à supprimer par un ""
str = Replace(str, TonEnreg & vbCrLf, "")

'tu réécris tout le fichier en l'écrasant
nf2 = FreeFile
Open "c:\temp\essai.txt" For Output As #nf2
Print #nf2, str
Close #nf2

Prend quand même la précaution de n'essayer ce code que sur une copie de ton fichier au cas où...

Pour le trancate de Pascal, je ne sais pas.

Le mieux serait quand même d'utiliser une base de données.

Loup Gris
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 mai 2005 à 20:54
si tu connais SetEndOfFile tu devrais connaître SetFilePointer

Private Const FILE_END = 2

Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long

' - 10 caractères à partir de la fin
SetFilePointer hFile, -10&, -1&, FILE_END

Daniel
0
EMSIEN Messages postés 194 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 11 juin 2009
8 mai 2005 à 00:17
Gobillot j'avais essayer de travailler avec cet API mais je sais pas pas trop koi faire dans les paramètres (malgré tes explications et celles de win32.hlp) voici ce que j'ai écris pour pouvoir supprimer le dernier enregistrement mais ça me donne des erreurs de compilation
SetFilePointer #3, Len(Categorie),- 1&, ty_cat
avec #3: le numéro que j'ai donné au fichier
len(categorie) la taille de l'enregistrement à effacer
-1& : je sais pas pk
ty_cat: la taille du fichier car je n'utilise pas eof(#3) ( ça marche pas comme je le veux)
donc STP si tu pourras m'aider sur ce point je te serais reconnaissant
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
8 mai 2005 à 01:47
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const OPEN_EXISTING = 3
Private Const OPEN_ALWAYS = 4
Private Const FILE_BEGIN = 0
Private Const FILE_CURRENT = 1
Private Const FILE_END = 2

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long

Private Declare Function SetEndOfFile Lib "kernel32" (ByVal hFile As Long) As Long

Dim Path As String
Dim Nbytes As Long


Path = "C:\le chemin du fichier"

hFile = CreateFile(Path, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ, ByVal 0&, OPEN_EXISTING, 0, 0)

If hFile = -1 Then MsgBox "Fichier Absent": Exit Sub

'en positif par rapport au début si tu connais la Longueur à garder
SetFilePointer hFile, 100&, 0&, FILE_BEGIN

'ou en négatif par rapport à la fin si tu connais la Longueur à enlever
' SetFilePointer hFile, -10&, -1&, FILE_END

SetEndOfFile hFile

CloseHandle hFile


Daniel
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
8 mai 2005 à 01:54
j'avais essayé ça marche.
comme j'ai plus l'exemple, j'ai recopié des bouts à droite à gauche, si j'ai oublié quelque chose tu me dis.
j'ai laissé Nbytes qui sert pas ici (c'est pour lire ou écrire) alors qu'il fallait mettre hFile (le handle du fichier)

Dim hFile As Long

Daniel
0
EMSIEN Messages postés 194 Date d'inscription lundi 26 juillet 2004 Statut Membre Dernière intervention 11 juin 2009
8 mai 2005 à 01:57
je suis entrain de voir ta solution pour le moment merci infiniment encore
et si tu pourras me donner ton MSN comme ça on pourras parler sur la chose si j'arrive pas à comprendre quelques chose.
merci encore
0
Rejoignez-nous