CRÉER UN FICHIER DE TAILLE X, TRÈS RAPIDEMENT

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 6 août 2007 à 22:40
Erudix Messages postés 20 Date d'inscription jeudi 8 septembre 2011 Statut Membre Dernière intervention 30 juillet 2012 - 25 juin 2012 à 15:47
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/43682-creer-un-fichier-de-taille-x-tres-rapidement

Erudix Messages postés 20 Date d'inscription jeudi 8 septembre 2011 Statut Membre Dernière intervention 30 juillet 2012 3
25 juin 2012 à 15:47
Le problème vient du format du disque apparemment, formatez en NTFS et vous n'aurez plus ce problème.
Erudix Messages postés 20 Date d'inscription jeudi 8 septembre 2011 Statut Membre Dernière intervention 30 juillet 2012 3
24 juin 2012 à 18:38
Pour info j'utilise ce code avec VS2010 et je l'ai convertit en .net
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 juin 2012 à 18:26
Sans cette instruction, le fichier ne sera pas fermé.
On ne sera pas sur que le fichier sera effectivement ecrit.

VB6 sur 64 bits est une chose assez sensible...
Erudix Messages postés 20 Date d'inscription jeudi 8 septembre 2011 Statut Membre Dernière intervention 30 juillet 2012 3
24 juin 2012 à 12:56
possible, je suis sous Windows 7 64bit et le programme ne peut plus se fermer (même avec le gestionnaire des tâches)et fait complètement bugger Windows. Même après avoir fermé VS, le .vshost continue de tourner pendant 5 min.
C'est gênant si on supprime CloseHandle hFile ??
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
24 juin 2012 à 10:51
Etrange, lié a l'OS ?
Erudix Messages postés 20 Date d'inscription jeudi 8 septembre 2011 Statut Membre Dernière intervention 30 juillet 2012 3
23 juin 2012 à 18:33
Bonjour,
Apparemment il y a un problème avec les fichiers d'un peu moins de 2 GO ; la dernière ligne (CloseHandle hFile) n'arrive pas à être exécutée et le programme s'y arrête et ne répond plus! Quelqu'un à une idée ?
Sinon, aucun souci avec les gros fichiers (testé jusqu'à 2To)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 déc. 2008 à 13:53
pas vraiment... je lis souvent par ce biais.
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
21 déc. 2008 à 10:43
ok merci !
Je viens de faire cela et ca marche :

Dim oS As CStringBuffer
Set oS = New CStringBuffer
For Each oObjet In macollection
oS.Append oObjet.Serialize & Chr(5) 'oObjet.Serialize utilise CStringBuffer et vbnullchar
Next oTsk

nNumFile = FreeFile
Open monfichier For Binary Access Write As nNumFile
Put #nNumFile, , oS.Value
Close nNumFile
Set oS = Nothing




et pour lire mon fichier :


Dim sBuff As String
nNumFile = FreeFile
Open monfichier For Binary Access Read As #nNumFile
sBuff = Space$(LOF(nNumFile))
Get #nNumFile, , sBuff
Close #nNumFile

Set macollection = New Collection
Dim tb() As String
tb = Split(sBuff, Chr(5))
For i = 1 To UBound(tb) - 1
If tb(i) <> "" Then
Set oObjet = New cObjet
Set oObjet = oObjet.UnSerialize(tb(i)) ' oObjet.UnSerialize utilise split renvoi un objet
macollection.Add oObjet
Set oObjet = Nothing
End If
Next i


ce qui m'intérroge sont les lignes
sBuff = Space$(LOF(nNumFile))
Get #nNumFile, , sBuff
car je pense qu'il doit y avoir une limite sur sBuff en nombre de caractères non ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
21 déc. 2008 à 09:09
vbNullChar par exemple (equivalent à chr(0)), sans "recalcul" incessant ^^
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
20 déc. 2008 à 16:49
RendField, j'ai déjà dis que tu n'étais pas humain !
C'est nickel , une fois de plus.

Ta Méthode : 0,36 secondes
Ma Méthode : 1,344 secondes

si on joue à qui perd gagne, je suis le grand vainqueur !

Question subsidiaire : pour séparer des chaines j'utilise chr(0) ou chr(1).. y'a mieux ?
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
20 déc. 2008 à 16:29
Merci beaucoup !, je teste de suite
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
20 déc. 2008 à 16:13
n accès au fichier...
(un par Put) fois le nombre d'items.

utilises ce genre de choses:
http://www.vbfrance.com/codes/CONCATENATION-RAPIDE-CHAINES-SANS-API_39831.aspx

pour préparer le tableau et l'ecrire en une fois
peug Messages postés 232 Date d'inscription mercredi 25 octobre 2000 Statut Membre Dernière intervention 5 octobre 2012
20 déc. 2008 à 11:40
J'en revient pas !

Dit Renfield, Je sauve un collection d'objet dans ce genre :

nNumFile = FreeFile
Open monfichier For Binary Access Write As nNumFile

Put #nNumFile, , lCount
For Each oObjet In macollection
oObjet.Save nNumFile
Next oObje
Close nNumFile


le save de l'oObjet :
public Sub Save(ByVal numFile As Long)
Put #numFile, , mVersion
Put #numFile, , id
Put #numFile, , IDUser
Put #numFile, , IDPeriod
Put #numFile, , IDOwner
...
end sub

et sur une collection de 2000 item c'est quelque peu long ; c'est relatif mais ca prend 3 à 4 secondes mais l'utilisateur trouve ca long s'il fait x changement à la foullée et je le comprend. En voyant ton code, j'ai été bluffé.
Penses-tu que c'est possible d'améliorer mon code ?
Jereck Messages postés 2 Date d'inscription lundi 2 juin 2003 Statut Membre Dernière intervention 27 mars 2008
27 mars 2008 à 09:31
Micko -> La limitation de taille en FAT32, c'est 4Go, pas 2 ;-)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 août 2007 à 22:33
pour le annuler, je l'avais corrigé en live, et ca a du crasher, du coup....

pour le > 4Go, c'est corrigé, ca fonctionnais, a la base, j'ai pas revérifié depuis.

pour le contenu du remplissage, que voudrais tu mettre ? (faudrais faire des WriteFile, ou un FileMapping)
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
17 août 2007 à 22:15
Bonsoir,

Encore deux petites remarques, après, promis j'arrête... -:);

Si on veut plus de 4GO, le prog ne le fait pas, donc peut-être un petit message d'avertissement serait bien venu. Ensuite, dans la boite de dialogue "Enregistrer sous", le bouton Annuler n'est pas pris en compte (et est donc traité comme OK)... Pour ce dernier, il semble assez simple de rajouter son traitement, avec par exemple les 3 lignes suivantes entourant ccdlg.showsave :

On Error Resume Next ' passe l'erreur causé par l'instruction suivante
CcDlg.CancelError = True 'Défini Erreur à True
CcDlg.ShowSave
If Err.Number 32755 Then Exit Sub 'Si bouton Annuler> l'erreur reste à 32755

Euh... une question en prime : Actuellement le fichier contient que des octets nuls, peut-on définir une autre valeur d'octet de remplissage ? (si oui, comment ?...)

Amicalement,
Us.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
17 août 2007 à 13:25
j'ai corrigé la chose...
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
16 août 2007 à 22:50
Bonsoir,

Je me suis mal exprimé pour les long. Tu as raison, c'est bien 4GO, mais la plage est coupée en deux : moitié en négatif, moitié en positif. Et donc quand je demande 3GO, le prog s'arrête sur nLow = CLng(vnSize) avec vnSize=3221225472, ce qui bloque Clng, ne pouvant dépasser la valeur positive 2147483647. JE ne suis tout même pas le seul à avoir ce problème ? Avec 3GO le prog fonctionne ??

Amicalement,
Us.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
16 août 2007 à 07:46
Long => 4GO

la taille en décimal ? pour allouer un demi octet ^^

non, je plaisante, j'ai bien vu le pourquoi de ta demande, j'ajouterais cela
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
15 août 2007 à 09:11
Bonjour,

Alors, oui je suis en FAT32, mais le problème se situe avant tout sur la ligne de code "nLow = CLng(vnSize)" dans CreateBigFile, dès qu'on demande 2GO... D'ailleurs, c'est assez logique, non ? Un long ne dépasse pas 2GO... je me trompe ? (j'ai un Owerflow)
(Je croyais aussi que c'était la FAT16 qui était limité à 2Go...)

Ensuite, pour moins de 2GO, cela fonctionne, mais ce n'est pas tout à fait instantanné chez moi (même si c'est tout même rapide). Il y a plusieurs secondes d'attente (environ 10s à la louche pour 700Mo).

De plus, une autre suggestion : il serait mieux de pouvoir rentrer la taille en décimale aussi...

Amicalement,
Us.
MickCo Messages postés 16 Date d'inscription mercredi 10 novembre 2004 Statut Membre Dernière intervention 13 août 2007
13 août 2007 à 17:04
Bonjour,

La limitation de 2Go est sans doute due à une partition formatée en FAT32.
Pour ne plus avoir cette limite, il faut formater en NTFS (il y a peut être quand même une limite, mais elle doit être assez élevée)
Par contre, de mémoire Win Me ne supporte pas le NTFS.
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
7 août 2007 à 23:01
Bonsoir,

Alors, c'est peut-être que pour moi que cela ne fonctionne pas comme il le faudrait... JE regarderai de nouveau pour essayer de comprendre mon problème.

Amicalement,
Us.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 août 2007 à 18:11
si, mais bon, l'un n'empeche pas l'autre ^^

pas eu le temps de looker wiki au matin :p
hvb Messages postés 939 Date d'inscription vendredi 25 octobre 2002 Statut Membre Dernière intervention 27 janvier 2009 3
7 août 2007 à 14:55
Le dos c'etait un codage 16bits, win 3.1 aussi je crois... mais à partir de 95 c'est du 32.
(tu m'as pas dit avoir fait IG toi :p ?)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 août 2007 à 07:14
a y reflechir deux minutes, je pense que WinMe et < fonctionneront pas bien...
du fait que ce sont des OS 16 bits (dites le si je dis une bettise)
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
7 août 2007 à 07:11
une barre de progression ? c'est instantanné, normallement ....

étrange cette limite de deux Go. Sur que je ne verifie pas non plus l'espace dispo :/
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
6 août 2007 à 22:40
Bonsoir,

Ben, sauf si on veut plus de 2Go alors cela bug chez moi; Peut-être à cause de windows XP car sous ME je n'ai jamais eu de limitation. Mais est-ce bien la bonne raison, je l'ignore.

De plus, peut-être une petite barre de progression serait plus sympa...

Amicalement,
Us.
Rejoignez-nous