Obtenir la taille d'un dossier et de ses sous dossiers

Soyez le premier à donner votre avis sur cette source.

Vue 8 803 fois - Téléchargée 697 fois

Description

Se trouve aussi ici: http://www.dev.winsysdev.com/

Voici un code qui permet d'obtenir la taille d'un dossier et de ses sous dossier.

Source / Exemple :


// ZIP

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Marche très très bien sauf que sur certains dossier la taille est différente de celle affiché par les propriétés de ce meme dossier.
Peut etre est-ce due aux fichiers et dossiers cachés ???
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

#include <windows.h>
#include <string.h>
#include <stdio.h>

#ifndef MAX_PATH
# define MAX_PATH (260u)
#endif

#if defined(_MSC_VER) && _MSC_VER >= 900
typedef signed __int64 _int64_t;
typedef unsigned __int64 _uint64_t;
#else
typedef signed long long _int64_t;
typedef unsigned long long _uint64_t;
#endif

typedef union {
struct {
unsigned long lo;
long hi;
};
_int64_t v;
}largeint;

char * addslash( char * str ) {

register char * ptr = str;
while ( *ptr ) ++ptr;
if ( ptr > str ) {
if ( *(ptr-1) != '\\' )
*ptr++ '\\', *ptr '\0';
}
return str;
}

char * n_strcpy( char * dst, char * src, unsigned sz ) {
char * bos = dst;
while ( sz-- && *src )
*dst++ = *src++;
*dst = '\0';
return bos;
}

void find_files( char * root, _uint64_t * size ) {

HANDLE find;
WIN32_FIND_DATA wfd;
char path[MAX_PATH+8];
largeint li;

addslash( n_strcpy( path, root, MAX_PATH ) );
strcat( path, "*.*" );

find = FindFirstFile( path, &wfd );
if ( find != INVALID_HANDLE_VALUE ) {

do {

if ( !( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ) {

li.lo = wfd.nFileSizeLow;
li.hi = wfd.nFileSizeHigh;
(*size) += li.v;

/* ou
(*size) += ( wfd.nFileSizeLow + wfd.nFileSizeHigh );
*/

}

} while ( FindNextFile( find, &wfd ) );
FindClose( find );

}

}

void find_directory( char * root, _uint64_t * size ) {

HANDLE find;
WIN32_FIND_DATA wfd;
char path[MAX_PATH+8];
char nroot[MAX_PATH+8];

find_files( addslash( root ), size );

n_strcpy( path, root, MAX_PATH );
strcat( path, "*.*" );

find = FindFirstFile( path, &wfd );
if ( find != INVALID_HANDLE_VALUE ) {

do {

if ( (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) {

if ( *(wfd.cFileName) != '.' ) {

n_strcpy( nroot, root, MAX_PATH );
strcat( nroot, wfd.cFileName );

find_directory( nroot, size );

}

}

} while ( FindNextFile( find, &wfd ) );
FindClose( find );

}

}

int main( int argc, char * argv[] ) {

char root[MAX_PATH];
_uint64_t size = 0;

strcpy( root, "c:\" );
find_directory(root, &size);

printf( "Directory size: %I64u byte(s)\n", size );

return 0;

}
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
J'ai essayé en choisissant C:
Ca a pas l'air de trop avancer: le disque dur n'est pas utilisé et l'UC est à 0%
Messages postés
398
Date d'inscription
jeudi 30 octobre 2003
Statut
Membre
Dernière intervention
15 juin 2007
2
moi, le truc que je trouve dommage, c'est au niveau de la conception, qui empeche la réutilisabilité complète.

Concrétement, tu peux pas prendre un .h et un .cpp pour le mettre dans ton prog et faire

#include "xxx.h"

__int64 taille = GetDirSize("...")

mais comme l'optique est didactique et que le but n'est pas de faire une bibliothèque standard réutilisable, ca n'est pas génant. Je suis conscient aussi du fait que de mettre la variable dwSize en globale plutot qu'en retour de fonction (comme on pourrait l'attendre) augmente les performances, nottament pour la pile et la récursivité

Mais après, chacun est à meme d'utiliser ca (ou non) pour ses propres besoins.

Bon travail

a+
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
1
Si tu re-regardes le code tu n'as pas de GetFileSize comme tu le dis. Et puis maintenant la taille est dans un 64 bits alors fichiers trop gros plus de problème.

Pourquoi ré-inventer la roue quand celle-ci tourne bien ? Et puis tu oublies quand même la fonction qui calcul la taille, elle ne s'est pas écrite toute seule.
Afficher les 13 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.