IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

FileSize en C++


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 10
    Points
    10
    Par défaut FileSize en C++
    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,

  2. #2
    boli_971
    Invité(e)
    Par défaut
    Salut,

    Sans ouvrir le fichier j'en ai aucune idée mais en l'ouvrant:
    http://cpp.developpez.com/faq/cpp/?p...HIERS_filesize

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    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.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    J'ai trouvé cette fonction en Delphi qui fonctione #1 pourtant jai essayé de la traduire mais ca me retourne -1...

    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;
    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
     
    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;
    }
    Si quelqu'un peut m'aider, merci !

  5. #5
    boli_971
    Invité(e)
    Par défaut
    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
    }

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Rien de standard

    Sinon, suivant l'OS, tu peux essayer stat(), GetFileSize() ou sa grande soeur GetFileSizeEx()

    et aussi boost comme annoncé plus haut
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    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.

    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 pouvait me traduire le code qui fonctionnerait en BC++ Builder

    Merci!

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Inazad Voir le message
    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
    Un IDE capricieux, cela se dompte

    Citation Envoyé par Inazad Voir le message
    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.
    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.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    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);
    ??

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Comme cela (gestion simplifiée des erreurs) :
    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;
    }
    Pas testé, à toi d'adapter maintenant
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 16
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 65
    Points
    65
    Par défaut
    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?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    Je crois que ce code fonctionne :

    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;
    }
    Je verifie si tout est OK!

    Merci!

  13. #13
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Tu aurais aussi pu utiliser GetFileAttributesEx qui renvoie la structure suivante:

    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;
    et qui marche mieux sur les fichiers de plus de 2 gigas

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Points : 10
    Points
    10
    Par défaut
    Le jour ou un client m'enverra une photo de plus de 2 go, j'vais lui dire de reduire son image

Discussions similaires

  1. Erreur de filesize sur un fichier existant
    Par taka10 dans le forum Langage
    Réponses: 1
    Dernier message: 20/03/2007, 10h44
  2. filesize => stat failed
    Par f1vincent dans le forum Langage
    Réponses: 1
    Dernier message: 29/11/2006, 12h38
  3. filesize et gros fichiers
    Par gorgonite dans le forum Langage
    Réponses: 1
    Dernier message: 13/11/2006, 22h13
  4. Paramètre FILESIZE dans un Import
    Par spiralcb dans le forum Oracle
    Réponses: 1
    Dernier message: 23/10/2006, 16h51
  5. Filesize over URl
    Par yobogs dans le forum Langage
    Réponses: 1
    Dernier message: 20/04/2006, 20h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo