#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char buftemp[255];
BOOL IsRoot(char* lpszPath)
{
char szRoot[4];
sprintf(szRoot,”%c:\\”,lpszPath[0]);
return !strcmp(szRoot,lpszPath);
}
void show(char*filepath)
{
char temp[1024];
strcpy(temp,filepath);
char *p=buftemp;
char *q=temp;
char *r=temp;
int size=0;
strcat(buftemp,”\\”);
for(;q&&(*q)&&(*p)&&!(*p-*q);q++,p++)
if(*p==’\\’)
{
*q=0;
size+=strlen(r)+1;
r=q+1;
}
memset(temp,’0′,size);
q=temp;
q+=size;
for(int i=0;i<size;i++)
printf(“ “);
printf(“%s\n”,q);
}
void func(char* filepath,int way)
{
char szFind[1024];
strcpy(szFind,filepath); //windows API 用lstrcpy,不是strcpy
if(!IsRoot(szFind))
strcat(szFind,”\\”);
strcat(szFind,”*.*”); //找所有文件
WIN32_FIND_DATA wfd;
HANDLE hFind=FindFirstFile(szFind,& wfd);
if(hFind==INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return;
do
{
if(wfd.cFileName[0]==’.')
continue; //过滤这两个目录
char szfile[255]={0};
if(IsRoot(filepath))
sprintf(szfile,”%s%s”,filepath,wfd.cFileName);
else
sprintf(szfile,”%s\\%s”,filepath,wfd.cFileName);
if(way==0)//directory
{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
strcpy(buftemp,szfile);
show(szfile);
func(szfile,1);
func(szfile,0);
}
}
else
{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
else show(szfile);
}
}while(FindNextFile(hFind,&wfd));
FindClose(hFind); //关闭查找句柄
}
int main(int argv,char *argc[])
{
if(argv-2)exit(1);
if(strcmp(argc[0],”tree”))exit(1);
system(“cls”);
char buf[1024]={0};
strcpy(buf,argc[1]);
strcpy(buftemp,buf);
func(buf,1);func(buf,0);
return 0;
}
用法如下: tree “c:\my doc” 目录中间不能有空格
我自己觉得这个程序写得很滥,只是想模仿出windows中的tree命令而已。
如果目录太深了,程序就会报错。不知道是不是递归太深引起的内存方面的问题
请大家帮我指点一下吧
>> 本文固定链接: http://www.vcgood.com/archives/2622
>> 转载请注明: jmy2446267 2008年08月14日 于 C语言帝国 发表