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

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

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 =-
Reply

Marsh Posté le 13-10-2003 à 14:52:18   

Reply

Marsh Posté le 13-10-2003 à 14:54:20    

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

Reply

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.
 
1oc = 1
1Ko = 1 000
1Mo = 1 000 000
1Go = 1 000 000 000


:heink:

Reply

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

Reply

Marsh Posté le 13-10-2003 à 15:03:30    

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

Reply

Marsh Posté le 13-10-2003 à 15:05:40    

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]

Reply

Marsh Posté le 13-10-2003 à 15:07:07    

Taz a écrit :

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


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

Reply

Marsh Posté le 13-10-2003 à 15:07:23    

encore manqué ...

Reply

Marsh Posté le 13-10-2003 à 15:09:21    

o_O ??

Reply

Marsh Posté le 13-10-2003 à 15:12:19    

Citation :

1Go = 4294967295

Reply

Marsh Posté le 13-10-2003 à 15:12:19   

Reply

Marsh Posté le 13-10-2003 à 15:16:34    

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.
Reply

Marsh Posté le 13-10-2003 à 15:17:32    

Taiche a écrit :

1 Go = 2^20 :o

2^30 :o

Reply

Marsh Posté le 13-10-2003 à 15:18:57    

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

Reply

Marsh Posté le 13-10-2003 à 15:19:45    

apparemment 10

Reply

Marsh Posté le 13-10-2003 à 15:21:07    

Taz a écrit :

apparemment 10


:D

Reply

Marsh Posté le 13-10-2003 à 15:21:13    


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.
Reply

Marsh Posté le 13-10-2003 à 15:22:10    

Taz a écrit :

apparemment 10


 
hmmm j'aurais dit 100 ...

Reply

Marsh Posté le 13-10-2003 à 15:22:27    

Taiche a écrit :

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


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

Reply

Marsh Posté le 13-10-2003 à 15:23:44    

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.
Reply

Marsh Posté le 13-10-2003 à 15:25:16    

drasche a écrit :


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

:non:  
c'est 1 Mebibyte :D

Reply

Marsh 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

Reply

Marsh Posté le 13-10-2003 à 15:27:54    

Taiche a écrit :


C'est pas 1024^2 ?

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

Reply

Marsh 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 :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.
Reply

Marsh Posté le 13-10-2003 à 15:30:02    

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

Reply

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


---------------
-= Team RC5-72 =-  -= Team Dolphin Project =-
Reply

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 :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.
Reply

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

Reply

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 ?
 
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
Reply

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 :ange:

Reply

Marsh Posté le 13-10-2003 à 15:53:33    

*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
Reply

Marsh Posté le 13-10-2003 à 17:55:05    

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

Reply

Marsh Posté le 13-10-2003 à 18:00:22    

: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)
Reply

Marsh Posté le 13-10-2003 à 22:17:53    

antp a écrit :

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


 
 :jap:


---------------
Le Tyran
Reply

Marsh 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.

Reply

Marsh Posté le 14-10-2003 à 07:30:23    

vraiment magnifique ces _

Reply

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;
}


---------------
-= Team RC5-72 =-  -= Team Dolphin Project =-
Reply

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 :
  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 "<<" )

Reply

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.
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 =-
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed