• C

size of directory

How to find out the size of a directory (i.e.) all its files and subdirectories.
Thank you.
Birendra
birenkdAsked:
Who is Participating?
 
Answers2000Connect With a Mentor Commented:
Assuming you mean under 95/98/NT

use FindFirstFile/FindNextFile/FindClose to iterate thru the files in a directory. This will tell you all the subdirectories as well (including . and .. subdirectories which you should ignore).  Remember FindFirstFile takes a wild card path therefore add "*.*" to the search path

For each item you get back a WIN32_FIND_DATA structure.  Which contains the size of file.  You can add this up to give total size of files.  If you meet a subdirectory, then recurse into the function to add up the total for a subdirectory, i.e.

void DirectoryTotal( const char * szDirectory, int * pTotal )
{
/* iterate thru files using using FindFirstFile etc. */
/* if a file, add to the total (*pTotal) += size */
/* if a directory and not "." or ".." then make a temporary variable with szDirectory strcat with the subdirectory name and call DirectoryTotal with sub directory name and pTotal */
}

all the funtion :-

int ntotal
DirectoryTotal( "C:\", &ntotal ) ;
printf( "total files=%d bytes", ntotal ) ;


On other operating systems there is usually a compiler/OS specific function to do directory search, in <direct.h>


0
 
birenkdAuthor Commented:
Its very urgent
0
 
ahoffmannCommented:
df .
0
Worried about phishing attacks?

90% of attacks start with a phish. It’s critical that IT admins and MSSPs have the right security in place to protect their end users from these phishing attacks. Check out our latest feature brief for tips and tricks to keep your employees off a hackers line!

 
StapleheadCommented:
birenkd,

are you looking for an environment-specific answer, or a general purpose C code answer?

if you're in a unix environment, then the "df" command will do it for you...

if you're in a dos environment, you could play around with the "dir/s" command; i believe that its last line of output will tell you the total size of all the files it found.

Or, are you looking for an algorithm or code in C which will traverse a directory tree and note the sum of the sizes of all files found?

Larry
0
 
Answers2000Commented:
char szCleanDir[MAX_PATH+10] ;
char szSearchPath[MAX_PATH+5] ;
WIN32_FIND_DATA fd ;
HANDLE hh ;
int ll ;
BOOL bOK = TRUE ;

/* Make sure dir has final slash */
strcpy( szCleanDir, szDirectory ) ;
ll = strlen(szCleanDir) ;
assert( ll > 0 ) ;
if ( szCleanDir[ll-1] != '\\' )
{
strcat( szCleanDir, "\\" ) ;
}

/* Generate search path */
strcpy( szSearchPath, szCleanDir ) ;
strcat( szSearchPath, "*.*" ) ;

/* Do search */
hh = FindFirstFile( szSearchPath, &fd ) ;
while ( ( hh != NULL ) && ( bOK ) )
{
if ( ( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) != 0 )
{
/* it's a directory */
char szSubDirectory[MAX_PATH+10] ;
if ( strcmp( (char *)fd.cFileName, "." ) == 0 ) continue ;
if ( strcmp( (char *)fd.cFileName, ".." ) == 0 ) continue ;
strcpy( szSubDirectory, szCleanDir ) ;
strcat( szSubDirectory, (char *)fd.cFileName ) ;
DirectoryTotal( szSubDirectory, pTotal ) ;
} else
{
/* it's a file */
(*pTotal) += fd.nFileSizeLow ;
}

bOK = FindNextFile( hh, &fd ) ;

} /* while* /

if ( hh != NULL ) FindClose(hh) ;

}



0
 
Answers2000Commented:
The above code goes inside the DirectoryTotal function, basically implementing the Win32 Algorithm.

Couple of points
1. File Sizes can exceed that of an int, (64 bit number).  Therefore if you want to take this into account change type of pTotal and modify "it's a file" section

2. Sorry if any typos, but hopefully you get the point
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.