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 dossier avec l'API windows


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    aucun
    Inscrit en
    Octobre 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Par défaut Récupérer la taille d'un dossier avec l'API windows
    Bonjour,

    Je commence à manipuler l'API windows qui possède une très bonne documentation.

    Cependant je n'arrive pas à faire fonctionner une fonction toute simple : GetFileSize(). Voici mon bout de code :
    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
     
    char file[1024];
    char taille[1024];
    DWORD retour, fileSize;
    HANDLE hFile;
     
    memset(file, 0, sizeof(file));
    memset(taille, 0, sizeof(taille));
     
    strcpy(file, "c:\\MonDossierTest\\toto.txt");
    printf("Nom du dossier : %s\n", file);
     
    hFile = CreateFile(file, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    if(hFile == INVALID_HANDLE_VALUE){
        printf("Fichier inexistant : %s\n", file);
        return -1;
    }
     
    retour = GetFileSize(hFile, &fileSize);
    if(retour == INVALID_FILE_SIZE){
        printf("Taille inconnu : %s, %lu\n", file, GetLastError());
        return -1;
    }
     
    printf("Taille : %lu\n", fileSize);
    Ce bout de code doit normalement ouvrir mon ficher en lecture puis récupérer sa taille.
    Sa taille est de 2362 octets hors la console m'affiche 0 octet je ne sais pas pourquoi ?

    Merci d'avance.

    PS : je sais qu'il existe la fonction GetFileSizeEx qui est plus récente mais j'aimerai faire marcher la fonction GetFileSize avant.

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    If the function succeeds, the return value is the low-order doubleword of the file size, and, if lpFileSizeHigh is non-NULL, the function puts the high-order doubleword of the file size into the variable pointed to by that parameter.
    Ceci fonctionnera parfaitement bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    retour = GetFileSize(hFile, &fileSize);
    if(retour == INVALID_FILE_SIZE){
        printf("Taille inconnu : %s, %lu\n", file, GetLastError());
        return -1;
    }
     
    printf("Taille : %lu\n", retour);
    Edgar.

  3. #3
    Membre confirmé
    Profil pro
    aucun
    Inscrit en
    Octobre 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Par défaut
    Merci pour ta réponse, je suis un

    Est ce qu'il y a une méthode native pour récupérer la taille d'un dossier ? Je n'ai rien trouvé dans les méthodes du site d'aide msdn. Je vais toutefois continuer mon investigation.

    J'ai trouvé une fonction récursive sur ce site : http://www.developpez.net/forums/d10...le-repertoire/, mais cette méthode peut être longue pour un dossier contenant un grand nombre de fichiers.

    Je pense qu'il y a un moyen de récupérer les propriétés d'un dossier directement

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 119
    Par défaut
    Ça m'étonnerais.

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    Non, il n'y a rien en natif. Il faut l'écrire soi-même.

  6. #6
    Membre confirmé
    Profil pro
    aucun
    Inscrit en
    Octobre 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2009
    Messages : 98
    Par défaut
    Merci pour vos réponses.

    La fonction CreateFile permet d'ouvrir un répertoire quand on lui ajoute le flag "FILE_FLAG_BACKUP_SEMANTICS".

    Et d'après ce que je lis sur le site dans cette page :
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Il serait possible d'utiliser les fonctions "GetFileSize" ou "GetFileInformationByHandle" pour un répertoire grâce à l'handle que l'on récupère même si c'est un répertoire.

    J'ai donc créé la petite fonction suivante :
    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
    26
    27
    28
    29
    30
    31
    32
     
    void GetAllInfo(char * file){
     
        printf("Calcul de toutes les infos de : %s\n", file);
     
        HANDLE hFile;
        DWORD retour;
        BY_HANDLE_FILE_INFORMATION infos;
        SYSTEMTIME lastwritedate;
     
        hFile = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
        if(hFile == INVALID_HANDLE_VALUE){
            printf("Fichier inexistant : %s\n\n", file);
            return;
        }
     
        retour = GetFileInformationByHandle(hFile, &infos);
        if(retour == 0){
            printf("Impossible de recuperer toutes les informations de  %s.\n\n", file);
            return;
        }
     
        printf("Taille : %lu\n", infos.nFileSizeLow);
     
        retour = FileTimeToSystemTime(&infos.ftLastWriteTime, &lastwritedate);
        if(retour == 0){
            printf("Impossible de convertir la date de %s.\n\n", file);
            return;
        }
     
        printf("Date : %04d-%02d-%02d %02d:%02d:%02d\n\n", lastwritedate.wYear, lastwritedate.wMonth, lastwritedate.wDay, lastwritedate.wHour, lastwritedate.wMinute, lastwritedate.wSecond);
    }
    Que l'on peut appeler comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char file[1024];
     
    //Infos d'un dossier
    memset(file, 0, sizeof(file));
    strcpy(file, "c:\\MonDossierTest\\");
    GetAllInfo(file);
     
    //Infos d'un fichier
    memset(file, 0, sizeof(file));
    strcpy(file, "c:\\MonDossierTest\\toto.txt");
    GetAllInfo(file);
    Mais les résultats sont infructueux car pour le dossier j'ai une taille de 0.
    De plus pour la date de mon fichier, je remarque que l'heure est inexacte. Avez vous une idée du pourquoi ?

    Date de dernière modification de mon fichier : ‎Hier ‎11 ‎juin ‎2012, ‏‎14:22:03 et j'ai comme résultat : 2012-06-11 12:22:03 ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Récupérer la taille des fichiers/dossiers dans une même variable
    Par Bylliboy dans le forum VB.NET
    Réponses: 11
    Dernier message: 18/06/2014, 12h50
  2. Réponses: 13
    Dernier message: 30/11/2011, 09h04
  3. Réponses: 5
    Dernier message: 10/07/2007, 01h02
  4. Récupérer la taille d'un dossier...
    Par Life Hunter dans le forum Langage
    Réponses: 5
    Dernier message: 11/08/2005, 13h10

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