Créer un fichier de taille X rapidement

[Résolu]
Signaler
Messages postés
34
Date d'inscription
mercredi 19 novembre 2003
Statut
Membre
Dernière intervention
16 mai 2009
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
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

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
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)
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
34
Salut,

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







__________
Kenji

(


Nouveau forum VBA/Office
Messages postés
34
Date d'inscription
mercredi 19 novembre 2003
Statut
Membre
Dernière intervention
16 mai 2009
1
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
Messages postés
3172
Date d'inscription
dimanche 15 février 2004
Statut
Membre
Dernière intervention
9 avril 2017
34
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
Messages postés
34
Date d'inscription
mercredi 19 novembre 2003
Statut
Membre
Dernière intervention
16 mai 2009
1
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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
CreateFile
SetFilePointer
CloseHandle

Se fait en une infime fraction de seconde, imbattable.

ciao...
BruNews, MVP VC++
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
124
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...
Messages postés
34
Date d'inscription
mercredi 19 novembre 2003
Statut
Membre
Dernière intervention
16 mai 2009
1
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 !
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
VB appelle l'API pour accéder au matériel, alors devine quelle est la méthode la plus rapide.

ciao...
BruNews, MVP VC++
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
124
"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 !)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69