Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

Catégorie :API Classé sous : setendoffile, taille, gros, creer, rapidement Niveau : Débutant Date de création : 06/08/2007 Date de mise à jour : 19/08/2007 22:31:31 Vu / téléchargé: 5 658 / 276

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (21)
Ajouter un commentaire et/ou une note


Description

Bonjour,

Suite a une demande du Forum, je met a dispo une source qui m'est souvent utile.
Elle permet de créer facilement et rapidement des fichiers de taille arbitraire.

Je m'en sert par exemple lorsque j'ai besoin de calculer la taille d'un fichier, et que cette taille ne tient pas sur un Long...
 

Source

  • Private Const CREATE_ALWAYS As Long = 2
  • Private Const FILE_BEGIN As Long = 0
  • Private Const GENERIC_WRITE As Long = &H40000000
  • Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
  • Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
  • Private Declare Function SetEndOfFile Lib "kernel32.dll" (ByVal hFile As Long) As Long
  • Private Declare Function SetFilePointer Lib "kernel32.dll" (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByRef lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
  • Public Function CreateBigFile(ByRef vsFileName As String, ByVal vnSize As Variant) As Boolean
  • Dim hFile As Long
  • Dim nHigh As Long
  • Dim nLow As Long
  • Dim nTmp As Long
  • Const hFFFFFFFF = 4294967295#
  • Const h80000000 = 2147483648#
  • hFile = CreateFile(vsFileName, GENERIC_WRITE, 0, ByVal 0&, CREATE_ALWAYS, 0, 0)
  • If hFile <> -1 Then
  • If CCur(vnSize) > hFFFFFFFF Then
  • nHigh = Fix(vnSize / hFFFFFFFF)
  • vnSize = vnSize - CCur(hFFFFFFFF * nHigh)
  • End If
  • If CCur(vnSize) > h80000000 Then
  • nTmp = Fix(vnSize / h80000000)
  • nLow = vnSize - h80000000 * nTmp
  • nLow = nLow + nTmp * &H80000000
  • Else
  • nLow = CLng(vnSize)
  • End If
  • SetFilePointer hFile, nLow, nHigh, FILE_BEGIN
  • SetEndOfFile hFile
  • CreateBigFile = True
  • CloseHandle hFile
  • End If
  • End Function
Private Const CREATE_ALWAYS As Long = 2
Private Const FILE_BEGIN As Long = 0
Private Const GENERIC_WRITE As Long = &H40000000

Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByRef lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function SetEndOfFile Lib "kernel32.dll" (ByVal hFile As Long) As Long
Private Declare Function SetFilePointer Lib "kernel32.dll" (ByVal hFile As Long, ByVal lDistanceToMove As Long, ByRef lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long

Public Function CreateBigFile(ByRef vsFileName As String, ByVal vnSize As Variant) As Boolean
Dim hFile As Long
Dim nHigh As Long
Dim nLow As Long
Dim nTmp As Long
Const hFFFFFFFF = 4294967295#
Const h80000000 = 2147483648#
    hFile = CreateFile(vsFileName, GENERIC_WRITE, 0, ByVal 0&, CREATE_ALWAYS, 0, 0)
    If hFile <> -1 Then
        If CCur(vnSize) > hFFFFFFFF Then
            nHigh = Fix(vnSize / hFFFFFFFF)
            vnSize = vnSize - CCur(hFFFFFFFF * nHigh)
        End If

        If CCur(vnSize) > h80000000 Then
            nTmp = Fix(vnSize / h80000000)
            nLow = vnSize - h80000000 * nTmp

            nLow = nLow + nTmp * &H80000000
        Else
            nLow = CLng(vnSize)
        End If
    
        SetFilePointer hFile, nLow, nHigh, FILE_BEGIN
        SetEndOfFile hFile

        CreateBigFile = True
        CloseHandle hFile
    End If
End Function

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

16 août 2007 09:40:44 :
Gestion des valeurs décimales
17 août 2007 13:24:14 :
Il y avait un bug lorsque la taille voulue était comprise entre 2Go et 4Go, en gros.
19 août 2007 22:31:31 :
Soucis avec les fichiers > 4 Go

Commentaires et avis

signaler à un administrateur
Commentaire de us_30 le 06/08/2007 22:40:41

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.

signaler à un administrateur
Commentaire de Renfield le 07/08/2007 07:11:59 administrateur CS

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 :/

signaler à un administrateur
Commentaire de Renfield le 07/08/2007 07:14:21 administrateur CS

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)

signaler à un administrateur
Commentaire de hvb le 07/08/2007 14:55:21

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 ?)

signaler à un administrateur
Commentaire de Renfield le 07/08/2007 18:11:51 administrateur CS

si, mais bon, l'un n'empeche pas l'autre ^^

pas eu le temps de looker wiki au matin :p

signaler à un administrateur
Commentaire de us_30 le 07/08/2007 23:01:59

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.

signaler à un administrateur
Commentaire de MickCo le 13/08/2007 17:04:06

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.

signaler à un administrateur
Commentaire de us_30 le 15/08/2007 09:11:49

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.

signaler à un administrateur
Commentaire de Renfield le 16/08/2007 07:46:40 administrateur CS

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

signaler à un administrateur
Commentaire de us_30 le 16/08/2007 22:50:52

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.

signaler à un administrateur
Commentaire de Renfield le 17/08/2007 13:25:24 administrateur CS

j'ai corrigé la chose...

signaler à un administrateur
Commentaire de us_30 le 17/08/2007 22:15:48

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.

signaler à un administrateur
Commentaire de Renfield le 19/08/2007 22:33:01 administrateur CS

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)

signaler à un administrateur
Commentaire de Jereck le 27/03/2008 09:31:51

Micko -> La limitation de taille en FAT32, c'est 4Go, pas 2 ;-)

signaler à un administrateur
Commentaire de peug le 20/12/2008 11:40:03 10/10

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 ?

signaler à un administrateur
Commentaire de Renfield le 20/12/2008 16:13:02 administrateur CS

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

signaler à un administrateur
Commentaire de peug le 20/12/2008 16:29:08

Merci beaucoup !, je teste de suite

signaler à un administrateur
Commentaire de peug le 20/12/2008 16:49:51

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 ?

signaler à un administrateur
Commentaire de Renfield le 21/12/2008 09:09:51 administrateur CS

vbNullChar par exemple (equivalent à chr(0)), sans "recalcul" incessant ^^

signaler à un administrateur
Commentaire de peug le 21/12/2008 10:43:20

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 ?

signaler à un administrateur
Commentaire de Renfield le 21/12/2008 13:53:45 administrateur CS

pas vraiment... je lis souvent par ce biais.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Euh c gros ca [ par raphy2 ] J'ai fait une apli taille : 100 kotaille sur le disque 128 koC pas trop gros ca, ca dertangera pas trop l utilisateur?Vous avez fais jusqua combien vo Comment déterminer la taille d'un très gros fichier ? [ par MTB ] J'ai besoin de capturer la taille d'un très gros fichier (valeur excédant la capacité d'une variable "long"). Les fonctions traditionelles (FileLen, f Créer un fichier de taille X rapidement [ par Morinaux ] 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 changer la taille d'une image rapidement, sans picturebox [ par seb ] Voilà, j'aimerais bien savoir comment reduire la taille d'une image sans recopier pixels par pixels toute l'image, simplement en connaissant la taille comment creer un client FTP [ par mr.baron ] Si qqun pouvait m'expliquer le fonctionnement d'un client FTPET me donner un source d'un client FTP tres simplifié !je lui en serais reconnaissant Taille d'une feuille A4 (X,Y) pour VB [ par alain ] Lorsque l'on utilise "printer.CurrentX" ou ,"CurrentY", une feuille A4 commence à X=0 et Y=0, mais quelles sont les valeurs maximum pour une X et Y??? Creer une Form avec des onglets [ par Flit ] Voilà je voudrais intégrer des onglets dans ma Form (vous savez ces trucs qui nous menent a une autre page, mais toujours dans la meme page en fait... Lister les fichiers d'un répertoire donné et leur taille [ par seb ] Désol', je suis nouveau sous VB...Merci de me répondre, en l'occurence, je voudrais énumérer les DLLs d'un répertoire donné (c:\Windows\System) creer un datagrid avec VB.NET [ par Cecile ] voila, j'y arrive sur VB6 mais impossible sur .net!!!j'essai de mettre toutes mes donnees d'une table ACCESS sur un datagrid VB.netj'ai cree une conne creer barre des taches [ par IG ] Bonjour Je voudrais savoir s'il est possible de créer une autre barre des taches?En effet je voudrais que ma Form soit comme la barre des Taches c'est


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.