OBTENIR LA TAILLE D'UN DOSSIER ET DE SES SOUS DOSSIERS

Signaler
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
-
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/27922-obtenir-la-taille-d-un-dossier-et-de-ses-sous-dossiers

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+
Afficher les 13 commentaires