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

Messages postés
228
Date d'inscription
samedi 21 mai 2005
Dernière intervention
26 avril 2012
- - Dernière réponse : BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 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
Messages postés
228
Date d'inscription
samedi 21 mai 2005
Dernière intervention
26 avril 2012
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de cs_ABF
Messages postés
15838
Date d'inscription
jeudi 8 août 2002
Dernière intervention
4 mars 2013
0
Merci
As tu essayé l'API GetFileSize ?
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Dernière intervention
17 février 2007
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
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
GetFileSize donne aussi le résultat sur 64 bits.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Dernière intervention
17 février 2007
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
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
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
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
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
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Dernière intervention
17 février 2007
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
Messages postés
1855
Date d'inscription
jeudi 23 mai 2002
Dernière intervention
24 juin 2018
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
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
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
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
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
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
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
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Dernière intervention
17 février 2007
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
Messages postés
630
Date d'inscription
vendredi 5 mai 2006
Dernière intervention
17 février 2007
0
Merci
OK avec toi BruNews, fso est une hérésie pure et simple.
Commenter la réponse de Dolphin Boy
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
0
Merci
Attention Gobillot, a égalemement faire le passage Signed / unsigned ......

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Commenter la réponse de Renfield
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
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
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
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
Messages postés
17308
Date d'inscription
mercredi 2 janvier 2002
Dernière intervention
22 août 2018
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
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
C'était pour te tenter, je sens que tu y viendras.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
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.