Taille d'un fichier de plusieurs Go

Résolu
cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 avril 2012 - 12 juil. 2006 à 18:47
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 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

20 réponses

cs_ABF Messages postés 227 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 26 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.

Bref Bonne continuation

ABF
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
12 juil. 2006 à 18:59
As tu essayé l'API GetFileSize ?
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 juil. 2006 à 20:08
GetFileSize donne aussi le résultat sur 64 bits.

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 juil. 2006 à 20:26
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++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 juil. 2006 à 20:35
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++
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 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

Je ne connaissais pas ta DLL, merci pour l'info.
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
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

jean-marc
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 juil. 2006 à 22:43
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
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 juil. 2006 à 22:58
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 juil. 2006 à 23:14
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++
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 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.
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
12 juil. 2006 à 23:32
OK avec toi BruNews, fso est une hérésie pure et simple.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 juil. 2006 à 09:57
Attention Gobillot, a égalemement faire le passage Signed / unsigned ......

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 juil. 2006 à 10:04
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
13 juil. 2006 à 13:15
on n'a décidemment pas les mêmes armes ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 juil. 2006 à 13:22
C'était pour te tenter, je sens que tu y viendras.

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 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.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous