Taille d'un fichier de plusieurs Go [Résolu]

cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention - 12 juil. 2006 à 18:47 - Dernière réponse : BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention
- 14 juil. 2006 à 10:19
Bonjour,

J'ai essayé de plusieurs manière mais que de mauvais résultat.

Je cherche à connaitre la taille d'un fichier faisant plusieurs giga (Merci de ne pas me dire Filelen)

Bonne journé

Merci
Afficher la suite 

Votre réponse

20 réponses

Meilleure réponse
cs_ABF 228 Messages postés samedi 21 mai 2005Date d'inscription 26 avril 2012 Dernière intervention - 14 juil. 2006 à 09:40
3
Merci
Bonjour,

Merci j'ai réussit en mélangeant un peu de tous sur vos réponse et je vous en remercie.

Il y a une chose que je n'aime pas trop avec les Apis c'est que si l'OS (vista) vire ces surcharges et bien le progs est à retravailler car la fonction n'existera plus ou sera ailleur ou modifiée.

Bref Bonne continuation

ABF

Merci cs_ABF 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de cs_ABF
cs_DARKSIDIOUS 15838 Messages postés jeudi 8 août 2002Date d'inscription 4 mars 2013 Dernière intervention - 12 juil. 2006 à 18:59
0
Merci
As tu essayé l'API GetFileSize ?
Commenter la réponse de cs_DARKSIDIOUS
Dolphin Boy 630 Messages postés vendredi 5 mai 2006Date d'inscription 17 février 2007 Dernière intervention - 12 juil. 2006 à 19:42
0
Merci
Salut
Perso, pour "plusieurs giga" j'utiliserais plutôt l'API GetFileSizeEx qui renvoit un Currency (GetFileSize ne renvoit qu'un Long -32 bit- donc limitée à 4 Go non signé sinon 2 Go max).
Seul problème, GetFileSizeEx ne fonctionne qu'à partir de W2K. Si tu as W98 je ne vois pas de solution.
Commenter la réponse de Dolphin Boy
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 12 juil. 2006 à 20:08
0
Merci
GetFileSize donne aussi le résultat sur 64 bits.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Dolphin Boy 630 Messages postés vendredi 5 mai 2006Date d'inscription 17 février 2007 Dernière intervention - 12 juil. 2006 à 20:21
0
Merci
BruNews > j'ai sans doute loupé un truc mais je ne vois pas comment un long vb6 donc 32 bits peut renvoyer du 64 bits.
Faut dire que je n'ai jamais été confronté au problème évoqué par ABF.
Je m'en vais tester de ce pas.
Commenter la réponse de Dolphin Boy
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 12 juil. 2006 à 20:26
0
Merci
DWORD GetFileSize(
  HANDLE hFile,
  LPDWORD lpFileSizeHigh
);

lpFileSizeHigh sera rempli des 32 bits haut des 64 bits de la taille.
Ensuite comment on fait en vb, pas mon truc.

GetFileSizeEx n'est qu'un wrapper de GetFileSize.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 12 juil. 2006 à 20:35
0
Merci
Pour info, je vous avais enveloppé tout cela dans ma dll:
http://www.vbfrance.com/code.aspx?id=18494

bnFileSize() retourne un double pour les grands fichiers.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Dolphin Boy 630 Messages postés vendredi 5 mai 2006Date d'inscription 17 février 2007 Dernière intervention - 12 juil. 2006 à 21:09
0
Merci
BruNews> Effectivement, tu as raison pour GetFileSize.

En VB c'est presque comme dans d'autres langages (comme le C ;-) ) :
- valeur hight dans Double
- décalage des bits de la variable Double vers le haut (*2^32)
- and de la valeur basse

Je ne connaissais pas ta DLL, merci pour l'info.
Commenter la réponse de Dolphin Boy
cs_JMO 1855 Messages postés jeudi 23 mai 2002Date d'inscription 24 juin 2018 Dernière intervention - 12 juil. 2006 à 22:25
0
Merci
 Bonsoir à tous,

Question posée:
Je cherche à connaitre la taille d'un fichier faisant plusieurs giga

Et pourquoi pas tout simplement:

ShowFolderSize ("D:\test.txt")
 Function ShowFolderSize(filespec)
   Dim fso, f, s
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set f = fso.GetFile(filespec)
   s = UCase(f.Name) & " occupe " & f.size & " octets."
   ShowFolderSize = s
MsgBox ShowFolderSize
End Function

jean-marc
Commenter la réponse de cs_JMO
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 12 juil. 2006 à 22:43
0
Merci
Salut,


fso devrait marcher !!!

sinon pour le Double, il ne suffit pas d'un simple décalage,

il faut prendre en compte les valeurs positives ou négatives de High et Low

avec risque de troncation à 15 chiff'res significatifs


    Resu = High

    If High < 0 Then Resu Resu + CM   ' (CM 2 ^ 64)

    If Low < 0 Then Resu = Resu + 1

    Resu = Resu * CM + Low

    MsgBox Resu

Daniel
Commenter la réponse de Gobillot
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 12 juil. 2006 à 22:58
0
Merci
correction:


c'est pas CM 2 ^ 64  mais bien CM 2 ^ 32


autant manipuler directement du Currency c'est plus facile.

quant à fso, on m'avait dit dans un précédent post (voir 669314) qu'il n'avait pas accès à certain répertoire

comme "System Volume Information" ... j'ai pas testé

Daniel
Commenter la réponse de Gobillot
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 12 juil. 2006 à 23:14
0
Merci
Laissez donc fso, c'est une calamité en performance. Charger un interpréteur script par dessus une virtual machine, c'est d'une lourdeur extreme.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Dolphin Boy 630 Messages postés vendredi 5 mai 2006Date d'inscription 17 février 2007 Dernière intervention - 12 juil. 2006 à 23:30
0
Merci
Bien vu Daniel, mais je ne peux pas tester, pas de fichier qui dépasse le giga chez moi.
Si j'ai un moment demain au boulot, et si je trouve un fichier aussi énorme (pas sùr), je vais essayer. A moins que , le 1er concerné, ait trouvé une réponse à partir de notre discussion.
Commenter la réponse de Dolphin Boy
Dolphin Boy 630 Messages postés vendredi 5 mai 2006Date d'inscription 17 février 2007 Dernière intervention - 12 juil. 2006 à 23:32
0
Merci
OK avec toi BruNews, fso est une hérésie pure et simple.
Commenter la réponse de Dolphin Boy
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 13 juil. 2006 à 09:57
0
Merci
Attention Gobillot, a égalemement faire le passage Signed / unsigned ......

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 13 juil. 2006 à 10:04
0
Merci
j'ai pu m'affranchir de la conversion de manière calculatoire, que VB peine a faire...

et voilà ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 13 juil. 2006 à 13:06
0
Merci
Exact je me souviens d'avoir déjà vu ton code, ça fonctionne.

Malgré tout j'ai refait en DLL (2,5 Ko) qui retourne currency de VB:

Declare Function bnFilesizeCRCY Lib "D:\bnfsize.dll" (ByVal fname As String) As Currency

Sub testSizeFile()
  Dim r As Currency
  r = bnFilesizeCRCY("E:\xpenall.GHO")
  Debug.Print r
End Sub

bnFilesizeCRCY() retourne 0.0001 si fichier introuvable

http://bnmvp.free.fr/bnfsize.zip
zip de 13 Ko contient un xls pour test depuis VBA et le proj complet (donc code), fait sur VS 2005 mais tout ASM.

Pourquoi:
CreateFile n'obtiendra pas de handle si le fichier est déjà ouvert en exclusif par un autre processus, gênant.
Le code en VB ruine les perfs qu'on devrait attendre d'appels directs API:
- Empilage de 3 params et transfert sur CopyMemory, très très bof.
- currency est une classe de nombre en virgule fixe, bien pour la précision mais une ruine en perfs pour les calculs. Ta multiplication par 10000 (comme chaque opération) implique une division préalable en interne et idem dans l'autre sens pour stockage. Je résouds cela par 2 pauvres 'MUL' et 1 'ADD' et sans aucun passage en FPU, y a pas photo.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 13 juil. 2006 à 13:15
0
Merci
on n'a décidemment pas les mêmes armes ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 13 juil. 2006 à 13:22
0
Merci
C'était pour te tenter, je sens que tu y viendras.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 14 juil. 2006 à 10:19
0
Merci
Au contraire c'est une garantie de perennité.
La fonction API est recherchée par VB avec GetProcAddress, sera trouvée ou non, auquel cas tu pourrais la changer et recompiler. Si par contre tu appelles les fonctins de VB et que l'API appelée en interne par VB n'y est plus alors il n'y a plus rien à faire. Ne pas oublier que c'est le systeme qui fournit absolument tout et que tout finit toujours en un appel systeme API.
Ceci dit, aucun risque que GetFileSize[Ex] disparaisse ni aucune autre fonction de base comme celles ci, plus rien ne tournerait. Elle est bien présente sur Vista 32 et 64.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.