begin process at 2012 02 16 10:44:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :7 128 / 314

Auteur : Renfield

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
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

Les Membres Club peuvent 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

 Sources du même auteur

Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ...
Source avec Zip Source avec une capture JSON PARSER - ANALYSE DE CHAINES JSON
Source avec Zip Source avec une capture MODULE DE TÉLÉCHARGEMENT DE FICHIER BASIQUE (SYNCHRONE / ASY...
Source avec Zip COURS DE PILOTAGE........D'APPLICATIONS
Source avec Zip CSOCKET - REMPLACEZ WINSOCK PAR LA VERSION 2 DES API

 Sources de la même categorie

Source avec Zip Source .NET (Dotnet) .NET DEPENDENCY VIEWER : ARBRE DES DÉPENDANCES D'UN ASSEMBLY... par ShareVB
Source avec Zip Source .NET (Dotnet) UTILITAIRE SKYDRIVE par MasterShadows
Source avec Zip ROTATION RAPIDE D'IMAGE par trex70
Source avec Zip Source avec une capture ENUMERATION DES PORTS TCP ET IDENTIFCATION DU PROCESS (PID) ... par Renfield
Source avec Zip Source avec une capture MOUSE SPEED AND WEIGHT : RETOUR DE FORCE VIRTUEL ! par ScSami

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture UN PHOTO RESIZEUR par patosch
Source avec Zip Source avec une capture Source .NET (Dotnet) GÉNÉRATEUR DE FICHIER par denpx
Source avec Zip Source avec une capture Source .NET (Dotnet) CRÉER UN FICHIER SITEMAP POUR GOOGLE EN TOUTE SIMPLICITÉ par fdiedler2000
Source avec Zip Source avec une capture MULTI-ECRANS : NOMBRE, COORDONNÉES, ZONES DE TRAVAIL ... par jack
CREER UN DOSSIER (AVEC SES DOSSIERS PARENTS) par bouv

Commentaires et avis

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.

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

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)

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

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

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.

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.

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.

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

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.

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

j'ai corrigé la chose...

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.

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)

Commentaire de Jereck le 27/03/2008 09:31:51

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

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 ?

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

Commentaire de peug le 20/12/2008 16:29:08

Merci beaucoup !, je teste de suite

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 ?

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

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

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 ?

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 Creer nouveau label sur picturebox et definir sa taille avec la souris [ par matheonimbus30 ] Bonsoir, Je creer en ce moment une sorte de paint et je souhaite creer un label sur une picturebox en mode executin et definir sa taille avec la sour Comment faire pour les "gros" besoin de mémoire ? [ par kabak ] Bonjour, Dans l'une de mes applications, j'aurais besoin de faire plusieurs tableau ayant des tailles qui approchent sérieusement des 64Kio. Hors mê creer nouveau fichier + nom du fichier ? [ par Tyrell2 ] bonjour, à un moment du programme je souhaite créer un nouveau fichier txt (je sais faire) je m'assure d'abord que le fichier existe ou pas sur le HD Problème en rapport avec Visual basic 2010 expres [ par eric141 ] Bonjours tout le monde,[^^happy13] J'ai un gros problème. Je ne sais pas si ce problème est fréquent mais bon... Donc mon problème c'est que quand je aide pour creer une form avec treeview a double sens [ par laser45 ] bonjour, voila je voudrai creer une sorte de grafcet en vba avec par exemple etape1 10 minute etape 2, 20 minutes, commence apres etape 1, etape suiv génération par récursivité d'un tableau ordonné de façon aléatoire [ par andryszakjeanmichel ] Comment pourrais-je améliorer les performances de la méthode itérative ? Merci pour votre contribution. Je cherchais à comparer les performanences e


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 5,008 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales