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 :

gestion d'erreur sur GetDiskFreeSpaceEx


Sujet :

C

  1. #1
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut gestion d'erreur sur GetDiskFreeSpaceEx
    Salut
    Je cherche à lister les disques ou le contenu d'un répertoire selon que le paramètre reçu.
    Voici le code qui me permet de lister les disques
    un ensemble de codes pris sur le net puis assemblés Je suis donc ouvert à toute amélioration.
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #include <tchar.h>
    #include <stdio.h>
    #include <windows.h>
    void disquepret(TCHAR *d)
    {
    	int r;
    	__int64 avlblspc, ttlspc, frspc;
     
    r=GetDiskFreeSpaceEx(d, (PULARGE_INTEGER)&avlblspc, (PULARGE_INTEGER)&ttlspc, (PULARGE_INTEGER)&frspc);
    if(r!=0){printf(" %I64dGO disponible", (ttlspc-frspc)/1000000000);}else{printf(" %s","Non disponible");}
    }
     
    void listerdisque()
    {
        TCHAR lpBuffer[500], * p;
     
        GetLogicalDriveStrings(sizeof(lpBuffer), lpBuffer);
     
        for(p = lpBuffer; *p != '\0'; p += 4)
    	{
    		if(GetDriveType(p)==2)
    		{printf("%s","Disque amovible");}
    		if(GetDriveType(p)==3)
    		{printf("%s","Disque local");}
    		if(GetDriveType(p)==3||GetDriveType(p)==2)
            {
    			disquepret(p);
    			printf(" %s\n",p);
    		}
    	}
     
        return ;
    }
     
    void explorerdossier()
    {
        HANDLE hEnt;
        WIN32_FIND_DATA ent;
     
        if ((hEnt = FindFirstFile(_T("*.*"), &ent)) != INVALID_HANDLE_VALUE)
        {
            do
                printf("%s\n", ent.cFileName);
            while (FindNextFile(hEnt, &ent));
     
            FindClose(hEnt);
        } 
        return;
    }
    Je voudrais gérer les erreurs générées par GetDiskFreeSpaceEx. Je pensais que "if(r!=0)..." suffisait.
    Merci d'avance.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  2. #2
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    La solution (trouvée ici)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SetErrorMode(SEM_FAILCRITICALERRORS);
    r=GetDiskFreeSpaceEx(d, (PULARGE_INTEGER)&avlblspc, (PULARGE_INTEGER)&ttlspc, (PULARGE_INTEGER)&frspc);
    SetErrorMode(0);
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Bonjour,
    J'ai quelques remarques:
    1. Pourquoi caster les pointeurs au lieu d'utiliser des ULARGE_INTEGER pour de vrai?
    2. d devrait être un pointeur const. p aussi, d'ailleurs.
    3. GetLogicalDriveStrings() attend une taille en TCHARs, pas en bytes. Tu devrais donc utiliser la macro ARRAYSIZE() (définie en C comme #define ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0]))) plutôt que l'opérateur sizeof seul.
    4. Je ne suis pas sûr que p+=4 soit garanti marcher, pour passer à la chaîne suivante. Par contre, p += (_tcslen(p)+1) devrait marcher.
    5. GetLogicalDriveStrings() retourne une valeur; il faut faire un test sur cette valeur, pour vérifier qu'elle est comprise entre 1 et ARRAYSIZE(lpBuffer)-1
    6. lpBuffer est un tableau, non un pointeur. Si tu tiens à utiliser la notation hongroise selon les conventions de Microsoft, tu devrais l'appeler rgBuffer ("rg" étant l'abbréviation de "range", je pense) ou peut-être szzBuffer (chaîne terminée par deux caractères nuls).
    7. La structure WIN32_FIND_DATA contient une chaîne de TCHARs: Pour l'afficher, tu devrais utiliser
    8. _tprintf(_T("%s\n"), ent.cFileName);

    Autrement, le code a l'air à peu près correct.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Médinoc , pouvez-vous proposer un code avec vos remarques.
    VS2010 me crie dessus quand j'essaye d’intégrer vos remarques. Peut-être des "include" manquants.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ceci compile sans problème et ne caus epas non plus d'erreurs d'édition de liens.
    Je n'ai pas tenté de l'exécuter.
    Code C : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h> /*À inclure APRÈS le reste*/
     
    /*Juste au cas où, mais normalement dans Visual c'est déjà défini*/
    #ifndef ARRAYSIZE
    #define ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0]))
    #endif
     
    void disquePret(LPCTSTR diskName)/*Note: 'LPCTSTR' = 'const TCHAR *' */
    {
    	BOOL r;
    	ULARGE_INTEGER availSpc = {0}, totalSpc = {0}, freeSpc = {0};
     
    	r=GetDiskFreeSpaceEx(diskName, &availSpc, &totalSpc, &freeSpc);
    	if(r) {printf(" %I64dGiO disponible", (freeSpc.QuadPart)/(2ull << 30)); }
    	else { printf(" %s","Non disponible"); }
    }
     
    void listerDisques()
    {
    	TCHAR buffer[500] = _T("");
    	TCHAR const* p;
     
    	DWORD length = GetLogicalDriveStrings(ARRAYSIZE(buffer), buffer);
    	if(length==0 || length >= ARRAYSIZE(buffer))
    		printf("%s", "Echec de GetLogicalDriveStrings().");
     
    	for(p = buffer; *p != _T('\0'); p += _tcslen(p)+1)
    	{
    		UINT driveType = GetDriveType(p); /*Pas la peinde de le rappeler 4 fois*/
    		if(driveType==2)
    		{ printf("%s","Disque amovible"); }
    		if(driveType==3)
    		{ printf("%s","Disque local"); }
    		if(GetDriveType(p)==3 || GetDriveType(p)==2)
    		{
    			disquePret(p);
    			_tprintf(_T(" %s\n"), p);
    		}
    	}
     
    	return ;
    }
     
    void explorerdossier()
    {
    	HANDLE hEnt;
    	WIN32_FIND_DATA ent = {0};
     
    	if ((hEnt = FindFirstFile(_T("*.*"), &ent)) != INVALID_HANDLE_VALUE)
    	{
    		do
    		{ _tprintf(_T("%s\n"), ent.cFileName); }
    		while (FindNextFile(hEnt, &ent));
     
    		FindClose(hEnt);
    	}
    	return;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Gestion des erreurs sur les noms des villes
    Par yosryosr dans le forum Pascal
    Réponses: 3
    Dernier message: 18/04/2008, 11h52
  2. gestions des erreurs sur les Noms des villes
    Par yosryosr dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2008, 12h07
  3. Gestion des erreurs sur SQLServer 2005
    Par vhellers dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/08/2007, 09h20
  4. Gestion des erreurs sur une commande multiple
    Par domiq44 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 05/10/2006, 15h03
  5. [PHP-JS] gestion des erreurs sur liste déroulente
    Par HwRZxLc4 dans le forum Langage
    Réponses: 9
    Dernier message: 28/05/2006, 03h21

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