上次写了个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<item list<item> > &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<item list<item> > &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 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 递归调用
具体看代码:















































































































































































