一个工具windows du,附代码

上次写了个windows tail,发在看雪无人问津,哎,希望这次这个不会:(
这个windows du功能和linux下的du差不多,只是没有把命令行写全,要想写全的,自己下个getopt,修改下参数,我这个是方便自己用的:)

另外本版有人说坛子里没人讲基础的东西,我想基础的东西需要自己琢磨,这个代码应该有些基础的东西可以学,希望给新手提供点基础的东西:)

而且这个工具对某些人应该有很大的帮助

用法: 1 wdu  :输出当前目录的文件数,目录数,文件大小等信息
       2 wdu somedir 输出目录somedir的文件数,目录数,文件大小等信息

eg:
C:/projects/encrypt>wdu
wdu (Windows du) by aker, version 0.1

1 dirs  64 files        3536.85 K       3.45 M

编译环境:cl + xpsp2

主要使用的一些基础的东西:
1 模板库中:queue,list
2 windows目录查询函数
{// 流程
    WIN32_FIND_DATA wfd;
    TCHAR           szFind[MAX_PATH];   // 遍历路径
。。。。设置要查询的路径。。。。
    HANDLE hDiskSearch = FindFirstFile(szFind, &wfd);
.....
    FindNextFile(hDiskSearch, &wfd);
.....
    FindClose(hDiskSearch); // 关闭查找句柄
}
3 递归调用


具体看代码:
 
/*
  2007-6-24 1:30
  一个windows版的du...
  by: aker 
  编译:cl du.cpp /EHsc
*/


#include 
< windows.h >
#include 
< stdio.h >
#include 
< queue >
#include 
< list >
#include 
< iostream >
using   namespace  std;

#pragma  comment(lib,"user32")

class  item
{
public:
    item()
{};
    item(
char *str){if(str != NULL) strcpy(path,str);};
    
char* getitem() {return path;}
    
void setitem(char *str) {if(str != NULL) strcpy(path,str);};
private:
    
char path[ MAX_PATH ];
}
;

static  unsigned all_filenum = 0 ,all_file_sizes = 0 ,all_dirnum = 0 ;

/*++

 Function Name  : IsRoot
 Abstract  : 判断路径是否为根
 Return Type  : BOOL
 Parameters     :
    [in] LPCTSTR lpszPath  -->
 Remarks:

--
*/

BOOL IsRoot(LPCTSTR lpszPath)
{
    TCHAR szRoot[
4];
    wsprintf(szRoot, 
"%c:/", lpszPath[0]);
    
return (lstrcmp(szRoot, lpszPath) == 0);
}



/*++

 Function Name  : Find
 Abstract  : list files in current directory
 Return Type  : void
 Parameters     :
    [in/out] queue > &iqueue--> 队列
 Remarks:

--
*/

void  lsfile(queue < item, list < item >   >   & iqueue)
{
    unsigned        files 
= 0;
    unsigned        filesizes 
= 0;
    WIN32_FIND_DATA wfd;
    item            myitem;
    LPCTSTR         lpszPath 
= iqueue.front().getitem();
    TCHAR           szFind[MAX_PATH];   
// 遍历路径

    lstrcpy(szFind, lpszPath);
    
if (!IsRoot(szFind))
        lstrcat(szFind, 
"/");
    lstrcat(szFind, 
"*.*");             // 找所有文件

    HANDLE hDiskSearch 
= FindFirstFile(szFind, &wfd);

    
if (hDiskSearch == INVALID_HANDLE_VALUE)  // 如果没有找到或查找失败
        return;

    
do
    
{
        
if (wfd.cFileName[0== '.')
        
{
            
continue// 直接输出结果,过滤这两个目录. ..
        }

        
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        
{// 如果找到的是目录,则此目录入队列
            TCHAR szFile[MAX_PATH];

            
if (IsRoot(lpszPath))
                wsprintf(szFile, 
"%s%s", lpszPath, wfd.cFileName);
            
else
                wsprintf(szFile, 
"%s/%s", lpszPath, wfd.cFileName);
            myitem.setitem(szFile);
            iqueue.push(myitem);
            all_dirnum
++;
        }

        
else
        
{
            files
++;
            filesizes 
+= wfd.nFileSizeLow;

        }

    }
 while (FindNextFile(hDiskSearch, &wfd));

    FindClose(hDiskSearch); 
// 关闭查找句柄
    
    all_filenum 
+= files;
    all_file_sizes 
+= filesizes;
}



/*++

 Function Name  : FindInAll
 Abstract      : 使用队列存储递归信息
 Return Type  : void
 Parameters     :
    [in/out] queue > &iqueue --> 队列

 Remarks:

--
*/

void  FindInAll(queue < item, list < item >   >   & iqueue)
{
    
while(!iqueue.empty())
    
{
        lsfile(iqueue);
        iqueue.pop();
    }

}


int  main( int  argc,  char *  argv[])
{
    
char *pathname = NULL;
    queue
<item, list<item> > iqueue;
    item path2find;
    printf(
"wdu (Windows du) by aker, version 0.1 ");
    
if (argc<2)    
    
{
        pathname 
= ".";
    }

    
else
    
{
        pathname 
= argv[1];
    }


    path2find.setitem(pathname);
    iqueue.push(path2find);

    FindInAll(iqueue);

#define KBYTES       (1024)
#define MBYTES       (1024*1024)
    printf(
"%d dirs %d files %.2f K %.2f M ",all_dirnum,all_filenum,
            (
float)all_file_sizes/KBYTES,(float)all_file_sizes/MBYTES);
    
return 0;
}

你可能感兴趣的:(windows,工具,parameters,path,list,iostream)