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

  1. #1
    Membre régulier
    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
    Points : 71
    Points
    71
    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 expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 564
    Points
    1 564
    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.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  3. #3
    Membre régulier
    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
    Points : 71
    Points
    71
    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 habitué
    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
    Points : 192
    Points
    192
    Par défaut
    Ça m'étonnerais.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 564
    Points
    1 564
    Par défaut
    Non, il n'y a rien en natif. Il faut l'écrire soi-même.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #6
    Membre régulier
    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
    Points : 71
    Points
    71
    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 ?

  7. #7
    Membre habitué
    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
    Points : 192
    Points
    192
    Par défaut
    Google/Bing/DuckDuckGo/tonmoteurpréféré est ton ami.
    http://cboard.cprogramming.com/windo...rectories.html

    Citation Envoyé par Sango64 Voir le message
    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.
    Mais rien ne dit que ça renvoie ce que tu voudrais que ça renvoie, et effectivement, ça sert à rien. (De toute façon, il est surtout écrit d'utiliser GetFileSizeEx, je ne sais pas pourquoi tu veux à tout prix utiliser GetFileSize).


    Pour ton histoire de date, il suffit de lire la doc :
    Citation Envoyé par http://msdn.microsoft.com/en-us/library/windows/desktop/ms724280(v=vs.85).aspx
    FileTimeToSystemTime function
    Converts a file time to system time format. System time is based on Coordinated Universal Time (UTC).
    et 12:22:03 UTC = 14:22:03 heure de Paris

  8. #8
    Membre régulier
    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
    Points : 71
    Points
    71
    Par défaut
    Google/Bing/DuckDuckGo/tonmoteurpréféré est ton ami.
    http://cboard.cprogramming.com/windo...rectories.html
    Je suis déjà aller sur ce topic et j'ai déjà cité une fonction similaire qui existe sur ce site http://www.developpez.net/forums/d10...le-repertoire/
    Du coup pas possible d'avoir simplement la taille d'un dossier tant pis ...

    Le problème de GetFileSizeEx c'est que dans le winbase.h il y a les lignes suivantes :
    #if (_WIN32_WINNT >= 0x0500)
    WINBASEAPI BOOL WINAPI GetFileSizeEx(HANDLE,PLARGE_INTEGER);
    #endif

    Du coup GetFileSizeEx n'est pas compatible avec tous les windows et j'aimerai que mon programme le soit

    Merci pour l'information de date

+ 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