Créer un fichier de taille X rapidement

Résolu
cs_Morinaux Messages postés 34 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 16 mai 2009 - 5 août 2007 à 00:43
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 6 août 2007 à 09:39
Bonjour,

J'ai déjà créé un programme qui permet de générer des fichiers de taille X mais le temps de création du fichier devient vite très longue si on dépasse le mo.

C'est normal que la procedure est longue puisque je lui demande d'insérer dans un fichier X caractères et que dès que la taille correspont à celle souhaitée, il arrète.

Y a-t'il un moyen d'optimiser ce code ? Pour le rendre plus rapide ? Et peut être plus précis, je sait pas ?

Merci

11 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 août 2007 à 02:42
Salut
FSO n'a pas la réputation d'être rapide. Utilisez plutôt les fonctions purement VB :

Private Sub Command2_Click()

   Dim i As Long
   Dim Size As String
   Dim ff As Long
   Dim Tableau(1023) As Byte   ' Le premier index est 0

   ' Prépare le tableau de 1024 caractères "1"
   ff = Asc("1")
   For i = 0 To 1023
      Tableau(i) = ff
   Next i

   ' Ecrit x fois le tableau de 1024 bytes
   ff = FreeFile
   Open Path.Text For Binary Access Write As #ff
   For i = 1 To Val(Taille.Text)
      Put #ff, , Tableau
      pb.Value = pb.Value + 1024
   Next i
   Close #ff
   DoEvents

   pb.Max = Val(Taille.Text) * 1024
   Size = Round(FileLen(Path.Text) / 1024, 2)
   If Size > 1024 Then
      Size = Round(Size / 1024, 2) & " Mo."
   Else
      Size = Size & " Ko."
   End If
   MsgBox "Procédure terminée, le fichier fait " & Size

End Sub

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Utilisateur anonyme
5 août 2007 à 01:03
Salut,

Si tu ne montre pas ton code, on va pas pouvoir d'aider







__________
Kenji

(


Nouveau forum VBA/Office
cs_Morinaux Messages postés 34 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 16 mai 2009 1
5 août 2007 à 01:11
Oui pas bête, le voici :

Private Sub Command2_Click()
    Set FSys = CreateObject("Scripting.FileSystemObject")
    Set MonFic = FSys.CreateTextFile(Path.Text)


    Dim i As Long
    Dim Size As String
    pb.Max = Taille.Text * 1024
       
    For i = 1 To Taille.Text * 1024
        With MonFic
            .write "1"
        End With
        pb.Value = pb.Value + 1
    Next i
   
    Size = Round(FileLen(Path.Text) / 1024, 2)
    If Size > 1024 Then
        Size = Round(Size / 1024, 2) & " Mo."
    Else: Size = Size & " Ko."
    End If
    MsgBox "Procédure terminée, le fichier fait " & Size
End Sub
Utilisateur anonyme
5 août 2007 à 01:17
Salut,

As-tu essayer avec les apis (CreateFile, WriteFile) ?
Exemple ici:
http://www.freevbcode.com/ShowCode.Asp?ID=1689


Ca devrai être plus rapide.





__________
Kenji

(


Nouveau forum VBA/Office

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

Posez votre question
cs_Morinaux Messages postés 34 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 16 mai 2009 1
5 août 2007 à 01:24
Ca à l'air intéressant mais s'il y avait un moyen sans utiliser d'API externe ce serait encore mieux :p
Je testerais demain.

Merci
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 août 2007 à 08:18
CreateFile
SetFilePointer
CloseHandle

Se fait en une infime fraction de seconde, imbattable.

ciao...
BruNews, MVP VC++
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
5 août 2007 à 08:30
je sais pas ce qui est le mieux : utiliser des "API externes" qui sont standard dans Windows, ou utiliser des "ocx externes"  eux aussi standards dans Windows, mais plus lents...
cs_Morinaux Messages postés 34 Date d'inscription mercredi 19 novembre 2003 Statut Membre Dernière intervention 16 mai 2009 1
5 août 2007 à 11:52
Wouah !
Jack, ta méthode est impeccable, 1 mo généré en 0,1 seconde.
En plus c'est tu n'utilises pas d'ocx ou d'api (bien si l'on veut partager son programme et que l'autre personne n'a que vb6fr.dll).

.Donc pour répondre à BruNews, SetFilePointer est aussi une API, certes les API sont (beaucoup) plus rapide que les OCX mais cela n'a pas d'égal face à la méthode de Jack (performances, légèreté, optimisation, ...).

Merci à tous et longue vie au VB et à VBFrance !
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
5 août 2007 à 12:57
VB appelle l'API pour accéder au matériel, alors devine quelle est la méthode la plus rapide.

ciao...
BruNews, MVP VC++
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
5 août 2007 à 12:58
"Cela n'a pas d'égal"... niveau performances, légéreté et optimisation, je dirais plutôt que les API n'ont pas d'égal : quoi de plus rapide qu'un appel vers un fonction système ? Un appel vers une fonction VB interprêté qui fait au final cet appel système ?

Je vois vraiment pas pourquoi les API te rebuttent tant morinaux ! Faut savoir que toutes les fonctions VB ne font qu'appel aux API au final... Sauf que ca passe entre temps dans l'interprêteur VB, donc autant les appeler directement dans le code, c'est bien plus rapide ! (VB n'étant pas très fort pour tout ce qui est entrée/Sortie !)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
6 août 2007 à 09:39
Rejoignez-nous