#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <string.h>
void processSize(char *name){
FILE * pFile;
pFile = fopen ( name , "rb" );
fseek ( pFile , 0L , SEEK_END );
long sz = ftell(pFile);
//fputs ( " sam" , pFile );
fclose ( pFile );
printf ("size = %ld bytes",sz);
}
void processFile(char gPath[]){
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
char *gCat;
char *gin;
char *cot;
char *cat;
char *fCat;
char *tempChr;
tempChr = (char *)malloc(strlen(gPath) * sizeof(char *));
strcpy(tempChr,gPath);
hFind = FindFirstFile(tempChr, &FindFileData);
while(FindNextFile(hFind, &FindFileData)){
gCat = strchr(tempChr,'*');
int inValue = strlen(tempChr) - strlen(gCat);
cot = (char *)(malloc(inValue * sizeof(char *)));
strncpy(cot,tempChr,inValue);
strcat(cot, FindFileData.cFileName);
if (!((strcmp(FindFileData.cFileName, ".")== 0)||
(strcmp(FindFileData.cFileName, "..")== 0))){
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
printf("----%s----\n",FindFileData.cFileName);
strcat(cot,"\\*.*");
processFile(cot);
printf("---End-%s---\n",FindFileData.cFileName);
}
else{
printf("\t\t|--%s--",FindFileData.cFileName);
processSize(cot);
printf("\n");
}
}
}
}
int _tmain(int argc, TCHAR *argv[])
{
//char *war = "C:\\Documents and Settings\\ideal\\Desktop\\*.*";
//processFile("C:\\Documents and Settings\\ideal\\Desktop\\audit\\*.*");
processFile("C:\\Documents and Settings\\ideal\\Desktop\\60-h\\*.*");
return 0 ;
}
Refactorings
No refactoring yet !
Ants
April 13, 2010, April 13, 2010 17:48, permalink
Code above doesn't compile using a default Visual Studio 2007 Win32 Console project.
I needed to stick in extra lines #undef UNICODE and #undef _UNICODE before line 1 to get the code to compile.
Here's how I would refactor the code to fix the memory and handle leaks in the original code, support compiling for UNICODE, as well as, provide for different filtering patterns.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
void RecurseDirectories(LPCTSTR pszDirectory, LPCTSTR pszPattern = TEXT("*"))
{
TCHAR szDir[MAX_PATH];
_stprintf_s(szDir, TEXT("%s\\%s"), pszDirectory, pszPattern);
WIN32_FIND_DATA finddata = { 0 };
HANDLE hFind = FindFirstFile(szDir, &finddata);
if (INVALID_HANDLE_VALUE == hFind)
return;
_tprintf(TEXT("----%s----\n"), pszDirectory);
do
{
if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (!_tcscmp(finddata.cFileName, TEXT(".")) ||
!_tcscmp(finddata.cFileName, TEXT("..")))
continue;
_stprintf_s(szDir, TEXT("%s\\%s"), pszDirectory, finddata.cFileName);
RecurseDirectories(szDir, pszPattern);
}
else
{
_tprintf(TEXT("\t\t|--%s--size = %ld bytes\n"), finddata.cFileName,
finddata.nFileSizeLow);
}
} while(FindNextFile(hFind, &finddata));
_tprintf(TEXT("---End-%s---\n"), pszDirectory);
FindClose(hFind);
}
int _tmain(int argc, TCHAR *argv[])
{
// RecurseDirectories(TEXT("C:\\Documents and Settings\\ideal\\Desktop\\60-h"), TEXT("*.*"));
RecurseDirectories(TEXT("."));
return 0 ;
}
Ants
April 14, 2010, April 14, 2010 06:34, permalink
An implementation that does a tree structured output, but significantly deviates from the output behavior of the original code.
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>
void Indent(unsigned cDepth, LPCTSTR pszFormat, ...)
{
while(cDepth-- > 0)
_tprintf(TEXT(" "));
va_list args;
va_start(args, pszFormat);
_vtprintf_s(pszFormat, args);
}
void RecurseDirectories(LPCTSTR pszDirectory,
LPCTSTR pszPattern = TEXT("*"),
unsigned cDepth = 0)
{
TCHAR szDir[MAX_PATH];
_stprintf_s(szDir, TEXT("%s\\%s"), pszDirectory, pszPattern);
WIN32_FIND_DATA finddata = { 0 };
HANDLE hFind = FindFirstFile(szDir, &finddata);
if (INVALID_HANDLE_VALUE == hFind)
return;
Indent(cDepth, TEXT("+--%s--\n"), pszDirectory);
do
{
if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (!_tcscmp(finddata.cFileName, TEXT(".")) ||
!_tcscmp(finddata.cFileName, TEXT("..")))
continue;
_stprintf_s(szDir, TEXT("%s\\%s"), pszDirectory, finddata.cFileName);
RecurseDirectories(szDir, pszPattern, cDepth + 1);
}
else
{
Indent(cDepth, TEXT("|--%s--size = %ld bytes\n"), finddata.cFileName,
finddata.nFileSizeLow);
}
} while(FindNextFile(hFind, &finddata));
FindClose(hFind);
}
int _tmain(int argc, TCHAR *argv[])
{
// RecurseDirectories(TEXT("C:\\Documents and Settings\\ideal\\Desktop\\60-h"), TEXT("*.*"));
RecurseDirectories(TEXT("."));
return 0 ;
}
I would like to improve my code, and I invite your comments. It traverses directory and print out files and folders in tree