begin process at 2008 07 06 02:42:03
1 205 441 membres
21 nouveaux aujourd'hui
14 119 membres club

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é: 4 689 / 256

Note :
Aucune note

Commentaire sur cette source (14)
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
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

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
  • 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 ;-)

Ajouter un commentaire

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

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

Boutique

Boutique de goodies CodeS-SourceS