Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1110 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++][Résolu]Recupérer la taille d'un fichier de plus de 4 Go

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++][Résolu]Recupérer la taille d'un fichier de plus de 4 Go

n°538233
alalex
Posté le 13-10-2003 à 14:52:18  profilanswer
 

Je rencontre un problème pour réucpérer la taille d'un fichier supérieur à 4 Gigas.
 
J'utilise FindFirst() avec TSearchRec :
 
struct TSearchRec {
 int Time;
 int Size;
 int Attr;
 AnsiString Name;
 int ExcludeAttr;
 int FindHandle;
 _WIN32_FIND_DATAA FindData;
 void * FindHandle;
 char[4097] FindData;
 char[257] Pattern;
};
 
On peut voir que 'Size' est un int, donc trop petit, car la taille est renvoyé en octets.
 
1oc = 1
1Ko = 1 000
1Mo = 1 000 000
1Go = 1 000 000 000
 
Merci pour votre aide


Message édité par alalex le 16-10-2003 à 17:57:43

---------------
-= Team RC5-72 =-  -= Team Dolphin Project =-
mood
Publicité
Posté le 13-10-2003 à 14:52:18  profilanswer
 

n°538236
Taz
bisounours-codeur
Posté le 13-10-2003 à 14:54:20  profilanswer
 

2^32 ça fait combien d'après toi ?

n°538239
drasche
Posté le 13-10-2003 à 14:56:10  profilanswer
 

alalex a écrit :

On peut voir que 'Size' est un int, donc trop petit, car la taille est renvoyé en octets.
 
1oc = 1
1Ko = 1 000
1Mo = 1 000 000
1Go = 1 000 000 000


:heink:

n°538241
Joel F
Real men use unique_ptr
Posté le 13-10-2003 à 15:02:09  profilanswer
 

un unsigned int = 32 bits =>
son max vaut 2^32-1 = 18446744073709551615
 
et chez moi 18446744073709551615 >>>> 1Go = 1073741824 octets

n°538244
Taz
bisounours-codeur
Posté le 13-10-2003 à 15:03:30  profilanswer
 

je crois que ta calculette windows a un problème
2^32 -> 4G

n°538247
drasche
Posté le 13-10-2003 à 15:05:40  profilanswer
 

Joel F a écrit :

un unsigned int = 32 bits =>
son max vaut 2^32-1 = 18446744073709551615
 
et chez moi 18446744073709551615 >>>> 1Go = 1073741824 octets


:non:
 
4294967295 [:aloy]

n°538249
Joel F
Real men use unique_ptr
Posté le 13-10-2003 à 15:07:07  profilanswer
 

Taz a écrit :

je crois que ta calculette windows a un problème
2^32 -> 4G


 
 [:t%40merenslip] spapossible :D
effectivement  
1Go = 4294967295 >> 1073741824

n°538250
Taz
bisounours-codeur
Posté le 13-10-2003 à 15:07:23  profilanswer
 

encore manqué ...

n°538251
Joel F
Real men use unique_ptr
Posté le 13-10-2003 à 15:09:21  profilanswer
 

o_O ??

n°538257
Taz
bisounours-codeur
Posté le 13-10-2003 à 15:12:19  profilanswer
 

Citation :

1Go = 4294967295

mood
Publicité
Posté le 13-10-2003 à 15:12:19  profilanswer
 

n°538262
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 13-10-2003 à 15:16:34  profilanswer
 

1 Go = 2^20 :o


Message édité par Taiche le 13-10-2003 à 15:22:49

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°538265
Taz
bisounours-codeur
Posté le 13-10-2003 à 15:17:32  profilanswer
 

Taiche a écrit :

1 Go = 2^20 :o

2^30 :o

n°538268
drasche
Posté le 13-10-2003 à 15:18:57  profilanswer
 

c'est à se demander combien savent compter ici :o

n°538270
Taz
bisounours-codeur
Posté le 13-10-2003 à 15:19:45  profilanswer
 

apparemment 10

n°538273
drasche
Posté le 13-10-2003 à 15:21:07  profilanswer
 

Taz a écrit :

apparemment 10


:D

n°538274
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 13-10-2003 à 15:21:13  profilanswer
 


C'est pas 1024^2 ? :??: 'tain, j'capte pu rien [:sisicaivrai]
EDIT : han la honte, j'ai confondu Go et Mo :o


Message édité par Taiche le 13-10-2003 à 15:22:11

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°538275
Joel F
Real men use unique_ptr
Posté le 13-10-2003 à 15:22:10  profilanswer
 

Taz a écrit :

apparemment 10


 
hmmm j'aurais dit 100 ...

n°538276
drasche
Posté le 13-10-2003 à 15:22:27  profilanswer
 

Taiche a écrit :

C'est pas 1024^2 ? :??: 'tain, j'capte pu rien [:sisicaivrai]


non ça c'est un megaoctet [:spamafote]

n°538277
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 13-10-2003 à 15:23:44  profilanswer
 

drasche a écrit :


non ça c'est un megaoctet [:spamafote]


Vala, merci :jap:
 
Voir ce lien pour une correspondance nom/valeur : http://www.alcyone.com/max/referen [...] inary.html


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°538278
*syl*
--> []
Posté le 13-10-2003 à 15:25:16  profilanswer
 

drasche a écrit :


non ça c'est un megaoctet [:spamafote]

:non:  
c'est 1 Mebibyte :D

n°538282
Taz
bisounours-codeur
Posté le 13-10-2003 à 15:26:56  profilanswer
 

1024 = 2^10 -> K (~ 10^3)
..   = 2^20 -> M (~ 10^6)
     = 2^30 -> G ...
 
 
on va dire que 2^i0 ~= 10^(3*i)
 
puisqu'évidemnt ln2(10) n'est ce pas

n°538285
Taz
bisounours-codeur
Posté le 13-10-2003 à 15:27:54  profilanswer
 

Taiche a écrit :


C'est pas 1024^2 ?

1024^2 -> (2^10)^2 = 2^20 n'est-il pas

n°538286
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 13-10-2003 à 15:29:09  profilanswer
 

Taz a écrit :

1024^2 -> (2^10)^2 = 2^20 n'est-il pas


T'es à la ramasse, j'ai édité 100 fois :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°538287
Taz
bisounours-codeur
Posté le 13-10-2003 à 15:30:02  profilanswer
 

mais ça ne te paraissait quane même pas claire malgré ton edit :o

n°538301
alalex
Posté le 13-10-2003 à 15:37:14  profilanswer
 

La question n'est pas la, comment je peux récupérer les tailles de ses fichiers ?
 
Ya til dautres fonctions en C++ pour récupérer la taille.
 
Merci


---------------
-= Team RC5-72 =-  -= Team Dolphin Project =-
n°538303
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 13-10-2003 à 15:37:37  profilanswer
 

Taz a écrit :

mais ça ne te paraissait quane même pas claire malgré ton edit :o


Chut :o Tu dévies ce topic et c'est mal et si j'étais un modo, je te sermonnerais et tu serais privé de dessert :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°538305
Taz
bisounours-codeur
Posté le 13-10-2003 à 15:38:40  profilanswer
 

non. par contre tu peux aller à la fin du fichier et mesurer la différence d'offset avec le début -> nombre de char lisibles

n°538312
LetoII
Le dormeur doit se réveiller
Posté le 13-10-2003 à 15:46:04  profilanswer
 

alalex a écrit :

La question n'est pas la, comment je peux récupérer les tailles de ses fichiers ?
 
Ya til dautres fonctions en C++ pour récupérer la taille.
 
Merci


 
Une taille d'1GO (2^30) s'écrit parfaitement dans un int comme ça a déjà été signalé, si non t'as un champ de ta structure qui doit être un pointeur vers une structure WIN32_FIND_DATA où tu trouve la taille sous la forme de 2 DWORD soit 64bits. Vu que t limité à 4GO par widows tu devrais être tranquille ;)


---------------
Le Tyran
n°538326
*syl*
--> []
Posté le 13-10-2003 à 15:52:20  profilanswer
 

LetoII a écrit :

Vu que t limité à 4GO par widows tu devrais être tranquille ;)

Faudrais te mettre à jour garçon :ange:

n°538329
LetoII
Le dormeur doit se réveiller
Posté le 13-10-2003 à 15:53:33  profilanswer
 

*Syl* a écrit :

Faudrais te mettre à jour garçon :ange:  


 
Moi la dernière fois que j'ai testé sous 2000 ct 4Go
 
Vérification faite, je me suis légéremùent fourvoyer sur ce point, toutes mes excuses  :jap:


Message édité par LetoII le 13-10-2003 à 16:11:15

---------------
Le Tyran
n°538506
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-10-2003 à 17:55:05  profilanswer
 

C'est en FAT32 que c'est 4 Go ;)

n°538509
drasche
Posté le 13-10-2003 à 18:00:22  profilanswer
 

:heink:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°538754
LetoII
Le dormeur doit se réveiller
Posté le 13-10-2003 à 22:17:53  profilanswer
 

antp a écrit :

C'est en FAT32 que c'est 4 Go ;)


 
 :jap:


---------------
Le Tyran
n°538941
Anerty
Posté le 14-10-2003 à 07:15:47  profilanswer
 

Pour récuperer la taille d'un très gros fichier (>4Go) tu disposes de ces fonctions:
_stati64() dans <sys/stat.h>
_filelengthi64 dans <io.h>
ou GetFileSizeEx() dans l'API win32
 
Tu auras la taille soit dans un __int64 dans les deux premieres, soit dans une structure LARGE_INTEGER pour la derniere.

n°538942
Taz
bisounours-codeur
Posté le 14-10-2003 à 07:30:23  profilanswer
 

vraiment magnifique ces _

n°539037
alalex
Posté le 14-10-2003 à 10:57:24  profilanswer
 

Merci pour vos réponses, j'ai enfin réussi :
 
__int64 TFichier::fct_iReturnSize(TSearchRec rep)
{
    int iFileHandle;
    __int64 iSize;
    __int64 iOffset = 0;
    AnsiString strFile;
 
    strFile = FPrincipal->acDirectory.SubString(0,FPrincipal->acDirectory.Length()-3) + rep.Name;
 
    iFileHandle = FileOpen(strFile,fmOpenRead);
    if(iFileHandle != -1)
    {
        iSize = FileSeek(iFileHandle,iOffset,2);
        FileClose(iFileHandle);
    }
    return iSize;
}


---------------
-= Team RC5-72 =-  -= Team Dolphin Project =-
n°539364
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-10-2003 à 15:53:48  profilanswer
 

Avec ton truc tu n'auras pas la taille si le fichier est déjà ouvert avec un autre soft.
C'est mieux d'utiliser FindFirst (vu que tu es sous C++Builder), j'ai juste le code en Delphi sous la main mais ça doit être très similaire :

Code :
  1. if FindFirst(FileName, faAnyFile, SearchRec) = 0 then
  2.     Result := (Int64(SearchRec.FindData.nFileSizeHigh) shl 32) + SearchRec.FindData.nFileSizeLow;
  3.   FindClose(SearchRec);


 
("shl" c'est l'équivalent de "<<" )

n°539629
alalex
Posté le 14-10-2003 à 20:37:48  profilanswer
 

antp a écrit :

Avec ton truc tu n'auras pas la taille si le fichier est déjà ouvert avec un autre soft.
C'est mieux d'utiliser FindFirst (vu que tu es sous C++Builder), j'ai juste le code en Delphi sous la main mais ça doit être très similaire :

Code :
  1. if FindFirst(FileName, faAnyFile, SearchRec) = 0 then
  2.     Result := (Int64(SearchRec.FindData.nFileSizeHigh) shl 32) + SearchRec.FindData.nFileSizeLow;
  3.   FindClose(SearchRec);


 
("shl" c'est l'équivalent de "<<" )


 
Merci ca marche c vraiment cool, c'est vraique je pouvais pas récupérer la taille des fichiers ouvert.
 
Ma fonction est devenue beaucou plus simple :
 
__int64 TFichier::fct_iReturnSize(TSearchRec rep)
{
    return (__int64(rep.FindData.nFileSizeHigh) << 32) + rep.FindData.nFileSizeLow;
}


Message édité par alalex le 14-10-2003 à 20:57:32

---------------
-= Team RC5-72 =-  -= Team Dolphin Project =-
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++][Résolu]Recupérer la taille d'un fichier de plus de 4 Go

 

Sujets relatifs
creer un fichier excel avec macro en java[C] Fonction fprintf et fichier formaté: j'ai du mal :/
[PHP] un script pour récupérer des infos sur Allocine ?Le meilleur moyen de lire / écrire dans un fichier en java
taille mini popupRecherche d'une chaine dans un fichier, pourquoi ça plante sur .exe ?
[PHP-GD] Transformer un fichier texte en image ...[ORACLE] récupérer les éléments X à Y d'une requete
Format d un fichier AVIAfficher une info bulle sur un lien [resolu]
Plus de sujets relatifs à : [C++][Résolu]Recupérer la taille d'un fichier de plus de 4 Go


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR