55502f40dc8b7c769880b10874abc9d0

I would like to improve my code, and I invite your comments. It traverses directory and print out files and folders in tree

#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 !

F9a9ba6663645458aa8630157ed5e71e

Ants

April 13, 2010, April 13, 2010 17:48, permalink

No rating. Login to rate!

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 ;
}
F9a9ba6663645458aa8630157ed5e71e

Ants

April 14, 2010, April 14, 2010 06:34, permalink

No rating. Login to rate!

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 ;
}

Your refactoring





Format Copy from initial code

or Cancel