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

C++ Discussion :

Récupérer la taille d'un fichier > à 2 Go.


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Récupérer la taille d'un fichier > à 2 Go.
    Bonjour,

    j'ai un problème pour récupéré la taille d'un fichier > à 2 Go.

    En suivant le tuto suivant :
    http://cpp.developpez.com/faq/bcb/?p...ttributfichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // ouverture du fichier en lecture
    int FichierHandle = FileOpen(Fichier, fmOpenRead);
    // FileSeek se déplace à 0 octets de la fin du fichier (2 représente la fin du fichier).
    // on formate la chaîne (# représente un chiffre)
    Label1->Caption = FormatFloat("### ### ### Ko", FileSeek(FichierHandle, 0, 2));
    // on germe le fichier
    FileClose(FichierHandle);
    J'ai essayé toute sorte de variables (long, double) mais rien n'y fait.
    Si quelqu'un aurait une idée

    Merci
    Flowp

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Il n'y a pas un FileSeek64 qui renvoie un entier de 64 bits ? (c'est quoi cette API ?)
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    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 Emmanuel Deloget Voir le message
    Il n'y a pas un FileSeek64 qui renvoie un entier de 64 bits ? (c'est quoi cette API ?)
    J'ail l'impression que c'est un truc spécifique à C++ Builder

    Citation Envoyé par flowp Voir le message
    j'ai un problème pour récupéré la taille d'un fichier > à 2 Go.
    ...
    J'ai essayé toute sorte de variables (long, double) mais rien n'y fait.
    Dans ce cas, il faut utiliser les bonnes API

    Sous Windows, GetFileSizeEx(), cela retourne la taille sur un nombre 64 bits (donc cela gère les tailles supérieure à 2 GO).

    Il faut ouvrir le fichier avec la fonction OpenFile() et ne pas oublier de refermer le fichier ensuite avec CloseHandle().

    La même chose peut être faite sans ouvrir le fichier avec GetFileAttributesEx().

    Sous Unix/Linux, il doit exister une API similaire.

    Autre chose, on évite d'utiliser des valeurs magiques dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileSeek(FichierHandle, 0, 2);
    et on utilise les constantes, c'est plus facilement lisible (même si c'est commenté)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileSeek(FichierHandle, 0, SEEK_END);
    D'ailleurs, c'est quoi ce 0 ?
    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
    .

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    FileSeek64(FichierHandle,0,SEEK_END);
    Ne fonctionne pas.

    Pour la fonction GetFileAttributesEx(), que dois-je mettre comme 3 paramètres ?
    C'est à dire pour :
    LPCTSTR lpFileName, -> je suppose que ça correspond au répertoire du fichier.
    GET_FILEEX_INFO_LEVELS fInfoLevelId,
    LPVOID lpFileInformation

    Pour les 2 autres je ne sais pas quoi mettre.

    Merci d'avance pour vos réponse

  5. #5
    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
    Bien lire la documentation jusqu'à complète compréhension

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <windows.h>
    ...
     
    WIN32_FILE_ATTRIBUTE_DATA info;
    if(GetFileAttributesEx("Fichier dont on veut connaitre la taille", GET_FILEEX_INFO_LEVELS, &info) == FALSE)
    {
       // erreur de récupération de la taille
    }
     
    // taille fichier est un nombre sur 64 bits qui contient la taille du fichier
    unsigned long long taille_fichier = (info.nFileSizeHigh << 32) | info.nFileSizeLow;
    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
    .

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Autre chose, on évite d'utiliser des valeurs magiques dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileSeek(FichierHandle, 0, 2);
    et on utilise les constantes, c'est plus facilement lisible (même si c'est commenté)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileSeek(FichierHandle, 0, SEEK_END);
    D'ailleurs, c'est quoi ce 0 ?
    Très certainement l'offset comme dans fseek() de la libc, ou std::ifstream::fseek()

    Selon la version de C++ Builder utilisée, il doit y avoir un autre moyen d'obtenir le résultat souhaité.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Le code suivant ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GET_FILEEX_INFO_LEVELS test;
     WIN32_FILE_ATTRIBUTE_DATA info;
     if(GetFileAttributesEx("C:\Users\Flow\Downloads\Fichier.iso",test, &info) == FALSE){
       ShowMessage("Impossible de récuperer la taille du fichier.");
     }
      // taille fichier est un nombre sur 64 bits qui contient la taille du fichier
      unsigned long long taille_fichier = (info.nFileSizeHigh << 32) | info.nFileSizeLow;
    J'obtiens une erreur a chaque fois, j'ai aussi un avertissement dans le décalage << 32.

    J'utilise C++ Builder 2010, effectivement s'il y a déjà une fonction qui peut récupérer la taille d'un fichier je suis preneur

  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 ram-0000 Voir le message
    D'ailleurs, c'est quoi ce 0 ?
    Citation Envoyé par Emmanuel Deloget Voir le message
    Très certainement l'offset comme dans fseek() de la libc, ou std::ifstream::fseek()
    Oui, pas idiot, c'est probablement cela
    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
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Le décalage << 32 ne fait rien si la valeur est déjà sur 32 bits. Il faut d'abord transformer la valeur en 64 bits (avec un cast) et ensuite faire le décalage.

    Je viens de regarder l'aide cd BC++B 2010. Il existe une fonction dans la libc qui va ter permettre de résoudre ton problème de manière portable (si tu compiles sous Windows ou sous Linux, ça devrait marcher). cf. http://docwiki.embarcadero.com/RADStudio/XE/en/Fseek. A noter la présence de la fonction tell() correspondante (http://docwiki.embarcadero.com/RADStudio/XE/en/Ftell). Prendre les version i64, ce qui devrait laisser assez de places pour stocker la taille d'un fichier > 2Go

    Ceci dit, la bonne manière pour récupérer la taille d'un fichier, ce n'est pas de l'ouvrir et d'aller à la fin ; c'est d'en regarder les propriétés. Pour celà, cf. http://docwiki.embarcadero.com/RADSt...ti64,_wstati64
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  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
    Citation Envoyé par Emmanuel Deloget Voir le message
    Le décalage << 32 ne fait rien si la valeur est déjà sur 32 bits. Il faut d'abord transformer la valeur en 64 bits (avec un cast) et ensuite faire le décalage.
    Tout à fait, un oubli de ma part
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    J'ai essayer avec la fonction stati64,
    mais test me renvoie un nombre négatif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AnsiString dir = ListBoxVideo->Items->Strings[ListBoxVideo->ItemIndex];
    stati64 test;
    stati64(dir.c_str(),test);

  12. #12
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par flowp Voir le message
    J'ai essayer avec la fonction stati64,
    mais test me renvoie un nombre négatif
    Parce que le code que tu as écrit là ne fait pas ce que tu crois. C'est étonnant qu'il compile d'ailleurs. Ou alors c'est une faute de frappe relativement violente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    AnsiString dir = ListBoxVideo->Items->Strings[ListBoxVideo->ItemIndex];
    struct stati64 test = { 0 };
    if (stati64(dir.c_str(),&test) < 0)
    {
    // erreur
    }
    test n'est modifié que si l'appel ne provoque pas d'erreur.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    AnsiString dir = ListBoxVideo->Items->Strings[ListBoxVideo->ItemIndex];
    struct stati64 test = { 0 };
    if (stati64(dir.c_str(),&test) < 0)
    {
    // erreur
    }

    J'ai une erreur à la compilation.
    "Impossible de transtyper de stati64* en stati64".

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/02/2007, 19h33
  2. Récupérer la taille d'un fichier
    Par kivan666 dans le forum Général JavaScript
    Réponses: 39
    Dernier message: 26/07/2006, 13h15
  3. Récupérer la taille d'un fichier
    Par vodevil dans le forum Langage
    Réponses: 12
    Dernier message: 19/07/2005, 17h53

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