Salut a tous,
existe t-il une manière simple et rapide de connaître la taille exacte d'un fichier sans avoir à l'ouvrir ?
J'en ai trouver en Delphi, C# mais pas en C++...
Merci,
Salut a tous,
existe t-il une manière simple et rapide de connaître la taille exacte d'un fichier sans avoir à l'ouvrir ?
J'en ai trouver en Delphi, C# mais pas en C++...
Merci,
Salut,
Sans ouvrir le fichier j'en ai aucune idée mais en l'ouvrant:
http://cpp.developpez.com/faq/cpp/?p...HIERS_filesize
Il n'y a rien de standard.
Mais il y a des fonctions dépendant de l'OS, et la fonction file_size de boost.filesystem permet de le faire de manière portable.
J'ai trouvé cette fonction en Delphi qui fonctione #1 pourtant jai essayé de la traduire mais ca me retourne -1...
C++ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // returns file size in bytes or -1 if not found. function FileSize(fileName : wideString) : Int64; var sr : TSearchRec; begin if FindFirst(fileName, faAnyFile, sr ) = 0 then result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow) else result := -1; FindClose(sr) ; end;
Si quelqu'un peut m'aider, merci !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 long __fastcall FileSize(AnsiString filename) { long retour = 0; TSearchRec sr; if ( FindFirst( filename, faAnyFile, sr ) == 0 ) retour += long(sr.FindData.nFileSizeHigh) << long(32) + long(sr.FindData.nFileSizeLow); else retour = -1; FindClose(sr); return retour; }
As-tu regardé le lien que je t'ai donnée ?
Sinon voici un code qui fonctionne en C++
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 long GetFileSize( std::ifstream & Fichier ) { // sauvegarder la position courante long pos = Fichier.tellg(); // se placer en fin de fichier Fichier.seekg( 0 , std::ios_base::end ); // récupérer la nouvelle position = la taille du fichier long size = Fichier.tellg() ; // restaurer la position initiale du fichier Fichier.seekg( pos, std::ios_base::beg ) ; return size ; } //Plus ciblé à ton cas long fileSize(const std::string& fileName) { std::ifstream file(fileName.c_str()); //ouvre un fichier en lecture if(!file) //test d'ouverture return -1; //ou throw quelqueChose file.seekg(0, std::ios::end); return file.tellg(); //retourne la taille //le fichier est fermé automatiquement }
Rien de standard
Sinon, suivant l'OS, tu peux essayer stat(), GetFileSize() ou sa grande soeur GetFileSizeEx()
et aussi boost comme annoncé plus haut
Bonjour,
je suis en Borland C++ Builder et je crois que je ne peux pas mettre tout ce que je veux vu que l'IDE est capricieux
Je sais que ce bout de code, en Delphi, fonctionne car j'ai vu un de mes amis dans ma classe l'utilisé avec BC++ mais je n'arrive plus a traduire ce code.
Si quelqu'un pouvait me traduire le code qui fonctionnerait en BC++ Builder
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 // returns file size in bytes or -1 if not found. function FileSize(fileName : wideString) : Int64; var sr : TSearchRec; begin if FindFirst(fileName, faAnyFile, sr ) = 0 then result := Int64(sr.FindData.nFileSizeHigh) shl Int64(32) + Int64(sr.FindData.nFileSizeLow) else result := -1; FindClose(sr) ; end;
Merci!
Un IDE capricieux, cela se dompte
A mon avis, la manière de faire dans le bout de code Delphi que tu présentes n'est certainement pas un exemple à reproduire.
Cet exemple utilise la fonction FindFirst()/FindClose() qui est une fonction d'énumération d'un répertoire.
Pour ce que tu veux faire (obtenir la taille d'un fichier), c'est un peut sortir le marteau pilon pour écraser une mouche.
Et je ne comprend pas que tu ne puisses pas utiliser au moins la fonction stat()
Mon conseil donc, dompte ton IDE et utilise les fonctions prévues à cet effet et énoncées un peu plus haut.
Admettons que j'ai le nom de mon fichier dans une structure a moi,
ex.: Proprietes->EnvoieC->Images[0]->filename
Comment j'utilise la fonction GetFileSize ?
dois-je faire :
??
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 FILE *f; f = fopen(Proprietes->EnvoieC->Images[0]->filename); long resultat = GetFileSize(f); fclose(f);
Comme cela (gestion simplifiée des erreurs) :
Pas testé, à toi d'adapter maintenant
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <sys/stat.h> off_t GetFileSize(const char *Filename) { if( (Filename == NULL) || (*Filename == 0) ) return -1; struct stat struct_stat; if(stat(Filename, &struct_stat) != 0) return -1; return struct_stat.st_size; }
La solution dans la faq (le lien dans le premier post de boli_971) n'est-elle pas portable et sûre?
Ou alors les fstream ne marchent pas avec borland?
Je crois que ce code fonctionne :
Je verifie si tout est OK!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 long __fastcall FileSize(AnsiString filename) { long retour = -1; struct stat struct_stat; if ( FileExists( filename ) ) { if ( stat( filename.c_str(), &struct_stat ) != 0 ) retour = -1; else retour = struct_stat.st_size; } return retour; }
Merci!
Tu aurais aussi pu utiliser GetFileAttributesEx qui renvoie la structure suivante:
et qui marche mieux sur les fichiers de plus de 2 gigas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 typedef struct _WIN32_FILE_ATTRIBUTE_DATA{ DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; } WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA;
Le jour ou un client m'enverra une photo de plus de 2 go, j'vais lui dire de reduire son image
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager