us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 2016
-
6 août 2007 à 22:40
Erudix
Messages postés20Date d'inscriptionjeudi 8 septembre 2011StatutMembreDernière intervention30 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.
Erudix
Messages postés20Date d'inscriptionjeudi 8 septembre 2011StatutMembreDernière intervention30 juillet 20123 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és20Date d'inscriptionjeudi 8 septembre 2011StatutMembreDernière intervention30 juillet 20123 24 juin 2012 à 18:38
Pour info j'utilise ce code avec VS2010 et je l'ai convertit en .net
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és20Date d'inscriptionjeudi 8 septembre 2011StatutMembreDernière intervention30 juillet 20123 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 24 juin 2012 à 10:51
Etrange, lié a l'OS ?
Erudix
Messages postés20Date d'inscriptionjeudi 8 septembre 2011StatutMembreDernière intervention30 juillet 20123 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 déc. 2008 à 13:53
pas vraiment... je lis souvent par ce biais.
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDerniè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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 21 déc. 2008 à 09:09
vbNullChar par exemple (equivalent à chr(0)), sans "recalcul" incessant ^^
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDerniè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és232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012 20 déc. 2008 à 16:29
Merci beaucoup !, je teste de suite
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 20 déc. 2008 à 16:13
n accès au fichier...
(un par Put) fois le nombre d'items.
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDerniè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és2Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention27 mars 2008 27 mars 2008 à 09:31
Micko -> La limitation de taille en FAT32, c'est 4Go, pas 2 ;-)
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 17 août 2007 à 13:25
j'ai corrigé la chose...
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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és16Date d'inscriptionmercredi 10 novembre 2004StatutMembreDernière intervention13 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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és939Date d'inscriptionvendredi 25 octobre 2002StatutMembreDernière intervention27 janvier 20093 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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és2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 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...
25 juin 2012 à 15:47
24 juin 2012 à 18:38
24 juin 2012 à 18:26
On ne sera pas sur que le fichier sera effectivement ecrit.
VB6 sur 64 bits est une chose assez sensible...
24 juin 2012 à 12:56
C'est gênant si on supprime CloseHandle hFile ??
24 juin 2012 à 10:51
23 juin 2012 à 18:33
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)
21 déc. 2008 à 13:53
21 déc. 2008 à 10:43
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 ?
21 déc. 2008 à 09:09
20 déc. 2008 à 16:49
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 ?
20 déc. 2008 à 16:29
20 déc. 2008 à 16:13
(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
20 déc. 2008 à 11:40
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 ?
27 mars 2008 à 09:31
19 août 2007 à 22:33
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)
17 août 2007 à 22:15
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.
17 août 2007 à 13:25
16 août 2007 à 22:50
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.
16 août 2007 à 07:46
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
15 août 2007 à 09:11
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.
13 août 2007 à 17:04
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.
7 août 2007 à 23:01
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.
7 août 2007 à 18:11
pas eu le temps de looker wiki au matin :p
7 août 2007 à 14:55
(tu m'as pas dit avoir fait IG toi :p ?)
7 août 2007 à 07:14
du fait que ce sont des OS 16 bits (dites le si je dis une bettise)
7 août 2007 à 07:11
étrange cette limite de deux Go. Sur que je ne verifie pas non plus l'espace dispo :/
6 août 2007 à 22:40
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.