ACCÉDER AU FICHIERS DE N'IMPORTE QUELLE TAILLE SANS FSO ET SANS OPEN "" AS

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 7 déc. 2003 à 23:24
bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 - 23 août 2004 à 17:43
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/18521-acceder-au-fichiers-de-n-importe-quelle-taille-sans-fso-et-sans-open-as

bilaloch Messages postés 556 Date d'inscription lundi 6 octobre 2003 Statut Membre Dernière intervention 31 octobre 2019 1
23 août 2004 à 17:43
Ne pourrais tu pas nommé tes boutons
Zoneur Messages postés 6 Date d'inscription dimanche 31 août 2003 Statut Membre Dernière intervention 25 mars 2005
27 juil. 2004 à 13:05
Hello, vue que tu es un passionné .. tu y arriveras pas avec tes api a remplacer la petite dll scrun.. because je m'en sert pour les fichiers qui sont trop gros pour un long .. donc un double il faut ;).. Mais sympas car même ce petit code.
gabchampagne Messages postés 216 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 5 mai 2004
13 janv. 2004 à 03:53
J'ai optimiser le code pour en garder la partie super lecteur seulement :

Public Event ReadWizzardData(Data As String, Percent As Long)
Public Event ReadWizzardFinish()
Public Event Error(Number)
Private Mstop As Boolean
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 CloseHandle Lib "kernel32" (ByVal hObject 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 ReadFile Lib "kernel32" (ByVal hfile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hfile As Long, lpFileSizeHigh As Long) As Long
'Erreurs
' CannotOpenFile = 0
' Unknown = 666
' InvalidStartPosition = 1
' InvalidEndPosition = 2
' InvalidPakSize = 3
'\Public Sub Cancel()
Mstop = True
End Sub
Private Sub Clean(hand As Long)
Mstop = False
CloseHandle (hand)
End Sub
Function Read(File, Optional Pak_Size As Long 100000, Optional StartPos As Long 0, Optional EndPos As Long = 0) As Boolean
Dim handle As Long, Taille As Long
Mstop = False
handle = CreateFile(File, -2147483648#, 1 Or 2, ByVal 0&, 3, 0, 0)
If handle = -1 Then
RaiseEvent Error(0)
Exit Function
End If
Taille = GetFileSize(handle, 0)
If Pak_Size < 0 Then
RaiseEvent Error(3)
Clean handle
Exit Function
End If
If StartPos < 0 Or StartPos > Taille Then
RaiseEvent Error(1)
Clean handle
Exit Function
End If
If EndPos 0 Then EndPos Taille
If Taille = 0 Then
RaiseEvent Error(666)
Clean handle
Exit Function
End If
If EndPos < StartPos Or EndPos > Taille Then
Clean handle
RaiseEvent Error(2)
Exit Function
End If
If StartPos <> 0 Then
SetFilePointer handle, StartPos, 0, 0
End If
Dim rendu As Long, Texte As String
rendu = StartPos
Read = True
Do Until (rendu + Pak_Size) > EndPos Or Mstop = True
Texte = String$(Pak_Size, 0)
ReadFile handle, ByVal Texte, Len(Texte), 0, ByVal CLng(0)
rendu = rendu + Pak_Size
RaiseEvent ReadWizzardData(Texte, (rendu / Taille) * 100)
DoEvents
Loop
If Mstop = True Then Clean handle: Exit Function
rendu = EndPos - rendu
If rendu <> 0 Then
Texte = String$(rendu, 0)
ReadFile handle, ByVal Texte, Len(Texte), 0, ByVal CLng(0)
RaiseEvent ReadWizzardData(Texte, 100)
End If
Clean handle
RaiseEvent ReadWizzardFinish
End Function
Private Sub Class_Terminate()
Mstop = True
End Sub

si vous savez comment optimiser ça davantage, dites moi le svp. Pi je pense pas qu'il y a moyen d'ouvrir en binary à moins de convertir ce qu'on lit en binary.
nephix2003 Messages postés 84 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 6 novembre 2004
20 déc. 2003 à 05:55
Salut

Très intéressant ton code.

J'aimerais savoir s'il est possible de l'utiliser pour optimiser un find/replace (si possible en binary access) ?
j'aurais besoin de traiter des fichiers qui peuvent atteindre en moyenne 18 Mo
gabchampagne Messages postés 216 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 5 mai 2004
10 déc. 2003 à 03:35
Note :
gabchampagne Messages postés 216 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 5 mai 2004
10 déc. 2003 à 03:30
Il manque juste la propriété AtEndOfLine et Line et column poue que ce soit identique à textstream

Mais, voici ce qu'il y a de plus :

Possibilité de commencer un fichier à l'endroit voulu
assisant pour ouvrir des fichiers de n'importe taille
récupérer le handle
lires plusieurs lignes de suite
obtenir la taille du fichier
PAS BESOINS DE SCRRUN.DLL
Récupérer la position du précise du curseur
sauter plusieur lignes de suite
cs_Alain Proviste Messages postés 908 Date d'inscription jeudi 26 juillet 2001 Statut Modérateur Dernière intervention 1 février 2015 2
9 déc. 2003 à 23:26
C très très interressant. Je te félicite pour avoir écris ce code et je me félicite pour être venu le voir.
gabchampagne Messages postés 216 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 5 mai 2004
9 déc. 2003 à 04:37
Nouvelle version. Plus simple. En une seule classe. Et permet de commencer un fichier où on veut. Hélas, ce n'est pas la solution pour patcher 1 caractère dans un fichier. Je vais essayer de travailler la dessus.
gabchampagne Messages postés 216 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 5 mai 2004
8 déc. 2003 à 14:22
noubliez pas que vous pouvez mettre ce code dans un control activex personnalisable. Pi il y a aussi la classe lecteur_v3 qui est très interressante.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2003 à 09:03
OUPS je n'avais pas vu que ton mode Append etait fait.
Bonne prog.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 déc. 2003 à 09:00
mode APPENDING pourrait etre ainsi:
METHODE stream.Open:
if hfile <> -1 Then CloseHandle(hfile)
hfile = CreateFile(nomFile, GENERIC_READ or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)
if hfile <> -1 Then SetFilePointer(hfile, 0, 0, FILE_END)
Fin de Open.
permet lecture mais a toi de voir.
METHODE stream.write(addrData, nBytes):
if hfile = -1 Then ErreurEtExit
SetFilePointer(hfile, 0, 0, FILE_END) ' si tu as permis lecture
WriteFile(hfile, addrData, nBytes, addrBytesWrited, 0)
Fin de write.
gabchampagne Messages postés 216 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 5 mai 2004
8 déc. 2003 à 02:08
Bonne nouvelle. Correction de quelque bug + pris en charge de append
gabchampagne Messages postés 216 Date d'inscription mercredi 2 avril 2003 Statut Membre Dernière intervention 5 mai 2004
8 déc. 2003 à 01:15
1- For appending veut dire ceci. Tu ouvre un fichier. Tu commence à écrire à partir de la fin du fichier. Comme quand on fait un log. C'est très pratique.

2- Je ne suis pas en vb.net, je suis en vb6. Je suis par contre ouvert à tout.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 déc. 2003 à 23:32
salut gabchampagne,
je te propose FileExists qu'il faudrait mettre en VB, eviterait l'emploi de celle issue de shell32 qui finira dans tous les cas par appeler FindFirstFile.
BOOL FileExists(const char* pszfl)
{
WIN32_FIND_DATA wfd;
HANDLE hfl = FindFirstFile(pszfl, &wfd);
if(hfl == INVALID_HANDLE_VALUE) return 0;
FindClose(hfl); return 1;
}
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 déc. 2003 à 23:24
Tu voudrais quoi de specifique dans le "For appending" ?
Rejoignez-nous