#include #include #include #include #include #include #define MAX_PATH_LEN 1023 #define MAX_DIRECTORY_BRANCH 1000 /* Don't know about MacOS... */ #ifdef __unix__ #define SEPARATOR_CHAR '/' #else #define SEPARATOR_CHAR '\\' #endif int main( int argc, char * argv[ ] ) { int i; if( argc == 1 ) { int totalSize = processDir( "." ); printf( "Total size for . is %d\n", totalSize ); } else for( i = 1; i < argc; i++ ) { int size = processDir( argv[ i ] ); printf( "Total size for %s is %d\n", argv[ i ], size ); } return 0; } /* * Return total size of all files */ int processDir( const char *dirName ) { DIR *dp; struct dirent *slot; struct stat buf; char *timeRep; int isDir; char fullName[ MAX_PATH_LEN + 1 ]; int numSubDirectories = 0; char *subdirectories[ MAX_DIRECTORY_BRANCH ]; int i; int totalSize = 0; printf( "DIRECTORY %s\n", dirName ); if( ( dp = opendir( dirName ) ) == NULL ) { fprintf( stderr, "Error opening directory\n" ); return 0; } for( slot = readdir( dp ); slot != NULL; slot = readdir( dp ) ) { sprintf( fullName, "%s%c%s", dirName, SEPARATOR_CHAR, slot->d_name ); if( stat( fullName, &buf ) == -1 ) { fprintf( stderr, "Error statting %s\n", fullName ); continue; } timeRep = ctime( (time_t *) &buf.st_mtim ); timeRep[ 24 ] = '\0'; printf( "%s ", timeRep ); totalSize += buf.st_size; isDir = ( buf.st_mode & S_IFMT ) == S_IFDIR; if( isDir ) printf( " (DIR) " ); else printf( " " ); printf( "%12d ", buf.st_size ); printf( "%s", slot->d_name ); printf( "\n" ); if( isDir && strcmp( slot->d_name, "." ) != 0 && strcmp( slot->d_name, ".." ) != 0 ) { if( numSubDirectories == MAX_DIRECTORY_BRANCH ) fprintf( stderr, "Directory branching limit exceeded\n" ); else subdirectories[ numSubDirectories++ ] = strdup( fullName ); } } printf( "\n" ); for( i = 0; i < numSubDirectories; i++ ) { totalSize += processDir( subdirectories[ i ] ); free( subdirectories[ i ] ); } closedir( dp ); return totalSize; }