begin process at 2012 02 11 23:45:37
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > AJOUTER UNE LIGNE DANS UN FICHIER - API

AJOUTER UNE LIGNE DANS UN FICHIER - API


 Information sur la source

Note :
Aucune note
Catégorie :API Classé sous :ajouter, ligne, fichier, log Niveau :Débutant Date de création :05/03/2006 Date de mise à jour :05/03/2006 10:54:43 Vu :9 716

Auteur : Nocturne

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note


 Description

Ajouter une ligne a la fin d'un fichier en utilisant les API :
CreateFile, WriteFile, ...
Positionne le pointeur avec SetFilePointer et FILE_BEGIN, ou FILE_END
Ca évite de lire le fichier dans une variable pour ajouter la ligne et enregistrer le fichier

Permet une alternative a l'utilisation de CreateObject("Scripting.FileSystemObject") avec CreateTextFile…, OpenAsTextStream…

Source

  • 'Module
  • Option Explicit
  • 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 WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
  • 'Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) 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
  • Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  • Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
  • Private Const GENERIC_READ = &H80000000
  • Private Const GENERIC_WRITE = &H40000000
  • Private Const FILE_SHARE_READ = &H1
  • Private Const FILE_SHARE_WRITE = &H2
  • Private Const FILE_ATTRIBUTE_HIDDEN = &H2
  • Private Const CREATE_NEW = 1
  • Private Const OPEN_ALWAYS = 4
  • Private Const OPEN_EXISTING = 3
  • Private Const FILE_BEGIN = 0
  • Private Const FILE_CURRENT = 1
  • Private Const FILE_END As Long = 2
  • 'Valeur de retour si erreur
  • Private Const INVALID_HANDLE_VALUE As Long = -1
  • Public Sub Debug_Log(Contenu_AddLine As String)
  • Dim PathFile As String: PathFile = ""
  • Dim hFile As Long: hFile = 0
  • Dim FileSize As Long: FileSize = 0
  • Dim Del_File As Long: Del_File = 0
  • Dim BytesWritten As Long: BytesWritten = 0
  • 'Receive the low and high-order halves of the file size
  • Dim loworder As Long, highorder As Long
  • 'Indique le chemin du fichier
  • If Right$(App.Path, 1) <> "\" Then
  • PathFile = App.Path & "\Log.txt"
  • Else
  • PathFile = App.Path & "Log.txt"
  • End If
  • 'Ajoute l'hrs au contenu
  • Contenu_AddLine = Right("00" & CStr(Day(Date)), 2) & "/" & Right("00" & CStr(Month(Date)), 2) & "/" & CStr(Year(Date)) & " - " & CStr(Time) & " | " & Contenu_AddLine
  • 'Crée le fichier, ou ouvre le fichier si il existe
  • hFile = CreateFile(PathFile, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0)
  • If hFile = INVALID_HANDLE_VALUE Then 'Il n'existe pas
  • 'Crée fichier
  • hFile = CreateFile(PathFile, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, CREATE_NEW, 0, 0)
  • End If
  • 'Récupére la taille du fichier en octets
  • 'Attention, GetFileSize peut renvoyer une taille de fichier maximum de : 2,147,483,647 bytes.
  • highorder = 0 'initialize the value for high-order half
  • loworder = GetFileSize(hFile, highorder)
  • FileSize = highorder * 2 ^ 32 + loworder
  • 'Je verifie si le fichier est vide
  • If FileSize = 0 Then 'Il est vide, on écrit une ligne
  • 'Positionne le pointeur a la fin du fichier
  • '2 posibilités : FILE_BEGIN ou FILE_END
  • 'SetFilePointer hFile, FileSize, 0, FILE_BEGIN
  • 'ou avec FILE_END celle que j'utilise
  • SetFilePointer hFile, 0, 0, FILE_END
  • 'On ajoute la ligne à la fin du fichier
  • WriteFile hFile, ByVal Contenu_AddLine, Len(Contenu_AddLine), BytesWritten, ByVal 0&
  • Else 'On limite la taille du fichier
  • 'Ici la limite est de 2 Mo soit 2,097,152 octets
  • If FileSize > 2097152 Then 'On vide le fichier
  • SetEndOfFile hFile
  • Else 'On ajoute un vbCrLf à notre ligne
  • Contenu_AddLine = vbCrLf & Contenu_AddLine
  • End If
  • 'Positionne le pointeur a la fin du fichier
  • '2 posibilités : FILE_BEGIN ou FILE_END
  • 'SetFilePointer hFile, FileSize, 0, FILE_BEGIN
  • 'ou avec FILE_END celle que j'utilise
  • SetFilePointer hFile, 0, 0, FILE_END
  • 'On ajoute la ligne à la fin du fichier
  • WriteFile hFile, ByVal Contenu_AddLine, Len(Contenu_AddLine), BytesWritten, ByVal 0&
  • End If
  • CloseHandle hFile
  • End Sub
'Module
Option Explicit

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 WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
'Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) 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
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long

Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const FILE_ATTRIBUTE_HIDDEN = &H2
Private Const CREATE_NEW = 1
Private Const OPEN_ALWAYS = 4
Private Const OPEN_EXISTING = 3

Private Const FILE_BEGIN = 0
Private Const FILE_CURRENT = 1
Private Const FILE_END As Long = 2

'Valeur de retour si erreur
Private Const INVALID_HANDLE_VALUE As Long = -1

Public Sub Debug_Log(Contenu_AddLine As String)
Dim PathFile As String: PathFile = ""
Dim hFile As Long: hFile = 0
Dim FileSize As Long: FileSize = 0
Dim Del_File As Long: Del_File = 0
Dim BytesWritten As Long: BytesWritten = 0
'Receive the low and high-order halves of the file size
Dim loworder As Long, highorder As Long

'Indique le chemin du fichier
If Right$(App.Path, 1) <> "\" Then
  PathFile = App.Path & "\Log.txt"
Else
  PathFile = App.Path & "Log.txt"
End If
'Ajoute l'hrs au contenu
Contenu_AddLine = Right("00" & CStr(Day(Date)), 2) & "/" & Right("00" & CStr(Month(Date)), 2) & "/" & CStr(Year(Date)) & " - " & CStr(Time) & " | " & Contenu_AddLine
'Crée le fichier, ou ouvre le fichier si il existe
hFile = CreateFile(PathFile, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0)
If hFile = INVALID_HANDLE_VALUE Then 'Il n'existe pas
  'Crée fichier
  hFile = CreateFile(PathFile, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, CREATE_NEW, 0, 0)
End If
'Récupére la taille du fichier en octets
'Attention, GetFileSize peut renvoyer une taille de fichier maximum de : 2,147,483,647 bytes.
highorder = 0  'initialize the value for high-order half
loworder = GetFileSize(hFile, highorder)
FileSize = highorder * 2 ^ 32 + loworder
'Je verifie si le fichier est vide
If FileSize = 0 Then 'Il est vide, on écrit une ligne
  'Positionne le pointeur a la fin du fichier
  '2 posibilités : FILE_BEGIN ou FILE_END
  'SetFilePointer hFile, FileSize, 0, FILE_BEGIN
  'ou avec FILE_END celle que j'utilise
  SetFilePointer hFile, 0, 0, FILE_END
  'On ajoute la ligne à la fin du fichier
  WriteFile hFile, ByVal Contenu_AddLine, Len(Contenu_AddLine), BytesWritten, ByVal 0&
Else 'On limite la taille du fichier
  'Ici la limite est de 2 Mo soit 2,097,152 octets
  If FileSize > 2097152 Then 'On vide le fichier
    SetEndOfFile hFile
  Else 'On ajoute un vbCrLf à notre ligne
    Contenu_AddLine = vbCrLf & Contenu_AddLine
  End If
  'Positionne le pointeur a la fin du fichier
  '2 posibilités : FILE_BEGIN ou FILE_END
  'SetFilePointer hFile, FileSize, 0, FILE_BEGIN
  'ou avec FILE_END celle que j'utilise
  SetFilePointer hFile, 0, 0, FILE_END
  'On ajoute la ligne à la fin du fichier
  WriteFile hFile, ByVal Contenu_AddLine, Len(Contenu_AddLine), BytesWritten, ByVal 0&
End If
CloseHandle hFile
End Sub

 Conclusion

On peut aussi remplacer une partie du texte avec SetFilePointer et FILE_BEGIN, FILE_END
Remplacer ne veut pas dire ajouter/supprimer du texte.
C'est remplacer une partie, par une partie égale en nombre de caractères.
Ca peut toujours servir.
++


 Historique

05 mars 2006 10:54:44 :
Maj : Vérif. INVALID_HANDLE_VALUE par rapport a CreateFile Modif. GetFileSize Remplacement de DeleteFile par vidage du fichier avec SetEndOfFile

 Sources du même auteur

Source avec Zip Source avec une capture INFO-BULLE PERSONNALISÉE, MULTILIGNES AVEC QQ OPTONS
Source avec Zip Source avec une capture INFORMATION DISQUE DUR
RETROUVE LA DATE DE CRÉATION D'UN FICHIER - API
Source avec Zip Source avec une capture ECHANGE DE MESSAGES WINDOWS ENTRE DEUX APPLICATIONS
Source avec Zip Source avec une capture TIRAGE DU LOTO

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) .NET DEPENDENCY VIEWER : ARBRE DES DÉPENDANCES D'UN ASSEMBLY... par ShareVB
Source avec Zip Source .NET (Dotnet) UTILITAIRE SKYDRIVE par MasterShadows
Source avec Zip ROTATION RAPIDE D'IMAGE par trex70
Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ... par Renfield
Source avec Zip Source avec une capture MOUSE SPEED AND WEIGHT : RETOUR DE FORCE VIRTUEL ! par ScSami

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) SUPPRIMER LIGNES VIDES FICHIER TEXTE par onix88
Source avec Zip Source .NET (Dotnet) DLL DE TRACE POUR EFFECTUER LE LOG DES APPLICATIONS (ÉCRITUR... par scoubigee
Source avec Zip Source .NET (Dotnet) MANSHILOG, DLL PERMETTANT D'ÉCRIRE ET DE LIRE DES LOGS par manshivas
Source .NET (Dotnet) CRÉER DES FICHIERS DE LOG EN QUELQUES LIGNES par Raidwan
Source avec Zip Source .NET (Dotnet) ROUTEUR DE FICHIERS EN TRAY ICON par marmous

Commentaires et avis

Commentaire de Willi le 05/03/2006 02:48:56 administrateur CS

Très bien comme code, propre et bien commenté :)
Fallais y penser :D

Par contre pourquoi supprimer le fichier si celui-ci est supérieur à 2 Mo. Imagine celui qui lit pas tes commentaires et qui exécute ton code sur un fichier de plus de 2 Mo...

Bonne continuation

Commentaire de BruNews le 05/03/2006 03:57:51 administrateur CS

Toujours vérifier le retour de CreateFile <> -1 avant de continuer.

Pourquoi fermer handle, supprimer fichier puis recréer ? c'est très couteux.
Ceci suffisait:
SetFilePointer hFile, 0, 0, FILE_BEGIN
SetEndOfFile hFile
ainsi fichier à 0 octet en un temps record et aucun risque de ratage d'obtention d'un nouveau handle.

Gaffe aussi au retour de GetFileSize, c'est un DWORD donc plage 32 bits NON SIGNE, les comparaisons < ou > en vb risquent fort de donner nimporte quoi. Comme les très grands fichiers deviennnet fréquents à notre époque, il convient de prendre l'habitude de fournir le second param à la fonction, un prog ne peut présumer la taille d'un fichier.

Commentaire de Nocturne le 05/03/2006 09:54:22

En réponse a Willi:
Je limite le fichier a 2 Mo car dans mon cas c'est un fichier de debugage, il me sert a lister les erreurs alors je le limite car je ne veux pas qu'il prenne dans le temps trop de place disque.

Tu as raison BruNews, j'ai pas fait gaffe.
Je ferais une MAJ pour la modif de vidage et non de suppression du fichier et par rapport a GetFileSize.

crenaud76 : C'est une autre facon d'ajouter une ligne dans un fichier et cela évite d'écrire un fichier via une variable.

Merci pour vos commentaires.
a+

Commentaire de johnnous le 20/02/2008 19:13:49

bonjour
j'aimerai faire un fichier log au fil de l'eau un fichier de taille fixe dans lequel je viens ecrire
c'est possible sans avoir 2 fichiers
Merci d'avbance

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

msdos.sys [ par Black26 ] Est-ce que le fichier ms-dos.sys fonctionne comme un fichier .ini pour ajouter une ligne de texte dans la section (options). Je sais qu'il faut enleve fichier log [ par smoron ] salut!j utilise un fichier de LOG (dll ARLOG) pour un programme.une fois le log rempli je dois le vider ligne par ligne.cest ca que je ne sais pas fa Ajouter une ligne au début d'un fichier [ par deedje ] Bonjour,J'ai un fichier (500 Mo, txt) auquel je souhaite ajouter juste une ligne au début.Comment faire avec un temps de traitement raisonnable (donc Ajouter une ligne à la fin d'un fichier texte [ par Quatrelator ] Bonjour,Je souhaiterais savoir comment ajouter une ligne à un fihier texte.Fichier texte:sapgw96 3396/tcpsapgw97 3397/tcpsapgw98 3398/tcpsapgw99 accés aux elements d'un fichier .txt [ par darkflyer ] bonjourdc voilà je repose la meme question, je souhaite acceder aux elements stockés ds un fichier .txt ligne par ligne sachant que sur chque ligne il Ajouter ligne formatée dans RichEditBox [ par BiGOuF ] Bonjour à tous,je suis débutant en vb, et celà fait quelques jours que je cherche des tutos sur les RichEditBox pour VB6.Je suis en train de faire un Axcrypt en ligne de commande [ par heddicmi ] Bonjour, Je souhaite utiliser un petit logiciel de cryptage de données appellé AxCrypt, qui peux s'utiliser en ligne de commande. Ca tombe bien, parce problème ligne fichier VB.net [ par rital1023 ] Bonjour tout le monde!!!J'ai une question concernant mon programme : en fait je possède des centaine et des centaines de fichier .log, qui s'ajoutent Ajout d'une ligne ne fin de fichier [ par lol733 ] Bonjour a tous!!! Je souhaiterai écrire une ligne ne fin de fichier à chaque ouverture de mon EXE. Je compte déjà le nombre de ligne dans mon fichier Rechercher un ligne dans un fichier texte [ par veler ] Bonjour tous le monde, voila, après de nombreuses recherches sur différent site web, je n'ai toujours pas de réponses à mais questions:comment cherche


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,933 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales