首页 > 用户发贴区 > 编程问题提问区 > 看我如何实现以目录树的形式遍历文件夹
2008
08-14

看我如何实现以目录树的形式遍历文件夹

#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命令而已。


如果目录太深了,程序就会报错。不知道是不是递归太深引起的内存方面的问题


请大家帮我指点一下吧


留下一个回复