cs_ABF
Messages postés227Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention26 avril 2012 14 juil. 2006 à 09:40
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.
Dolphin Boy
Messages postés630Date d'inscriptionvendredi 5 mai 2006StatutMembreDernière intervention17 février 2007 12 juil. 2006 à 19:42
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.
Dolphin Boy
Messages postés630Date d'inscriptionvendredi 5 mai 2006StatutMembreDernière intervention17 février 2007 12 juil. 2006 à 20:21
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.
Dolphin Boy
Messages postés630Date d'inscriptionvendredi 5 mai 2006StatutMembreDernière intervention17 février 2007 12 juil. 2006 à 21:09
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
cs_JMO
Messages postés1854Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention24 juin 201827 12 juil. 2006 à 22:25
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
Dolphin Boy
Messages postés630Date d'inscriptionvendredi 5 mai 2006StatutMembreDernière intervention17 février 2007 12 juil. 2006 à 23:30
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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 13 juil. 2006 à 13:06
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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 14 juil. 2006 à 10:19
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.