Recupérer la taille d'un fichier de plus de 4 Go [C++][Résolu] - C++ - Programmation
Marsh Posté le 13-10-2003 à 14:56:10
alalex a écrit : On peut voir que 'Size' est un int, donc trop petit, car la taille est renvoyé en octets. |
Marsh Posté le 13-10-2003 à 15:02:09
un unsigned int = 32 bits =>
son max vaut 2^32-1 = 18446744073709551615
et chez moi 18446744073709551615 >>>> 1Go = 1073741824 octets
Marsh Posté le 13-10-2003 à 15:03:30
je crois que ta calculette windows a un problème
2^32 -> 4G
Marsh Posté le 13-10-2003 à 15:05:40
Joel F a écrit : un unsigned int = 32 bits => |
4294967295
Marsh Posté le 13-10-2003 à 15:07:07
Taz a écrit : je crois que ta calculette windows a un problème |
spapossible
effectivement
1Go = 4294967295 >> 1073741824
Marsh Posté le 13-10-2003 à 15:16:34
1 Go = 2^20
Marsh Posté le 13-10-2003 à 15:21:13
Taz a écrit : 2^30 |
C'est pas 1024^2 ? 'tain, j'capte pu rien
EDIT : han la honte, j'ai confondu Go et Mo
Marsh Posté le 13-10-2003 à 15:22:27
ReplyMarsh Posté le 13-10-2003 à 15:23:44
drasche a écrit : |
Vala, merci
Voir ce lien pour une correspondance nom/valeur : http://www.alcyone.com/max/referen [...] inary.html
Marsh Posté le 13-10-2003 à 15:25:16
ReplyMarsh Posté le 13-10-2003 à 15:26:56
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
Marsh Posté le 13-10-2003 à 15:27:54
ReplyMarsh Posté le 13-10-2003 à 15:29:09
Taz a écrit : 1024^2 -> (2^10)^2 = 2^20 n'est-il pas |
T'es à la ramasse, j'ai édité 100 fois
Marsh Posté le 13-10-2003 à 15:30:02
mais ça ne te paraissait quane même pas claire malgré ton edit
Marsh Posté le 13-10-2003 à 15:37:14
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
Marsh Posté le 13-10-2003 à 15:37:37
Taz a écrit : mais ça ne te paraissait quane même pas claire malgré ton edit |
Chut Tu dévies ce topic et c'est mal et si j'étais un modo, je te sermonnerais et tu serais privé de dessert
Marsh Posté le 13-10-2003 à 15:38:40
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
Marsh Posté le 13-10-2003 à 15:46:04
alalex a écrit : La question n'est pas la, comment je peux récupérer les tailles de ses fichiers ? |
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
Marsh Posté le 13-10-2003 à 15:52:20
LetoII a écrit : Vu que t limité à 4GO par widows tu devrais être tranquille |
Faudrais te mettre à jour garçon
Marsh Posté le 13-10-2003 à 15:53:33
*Syl* a écrit : Faudrais te mettre à jour garçon |
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
Marsh Posté le 13-10-2003 à 18:00:22
Marsh Posté le 13-10-2003 à 22:17:53
ReplyMarsh Posté le 14-10-2003 à 07:15:47
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.
Marsh Posté le 14-10-2003 à 10:57:24
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;
}
Marsh Posté le 14-10-2003 à 15:53:48
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 :
|
("shl" c'est l'équivalent de "<<" )
Marsh Posté le 14-10-2003 à 20:37:48
antp a écrit : Avec ton truc tu n'auras pas la taille si le fichier est déjà ouvert avec un autre soft.
|
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;
}
Marsh Posté le 13-10-2003 à 14:52:18
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 =-