首页
社区
课程
招聘
C 目录递归问题
发表于: 2007-4-14 20:58 5513

C 目录递归问题

2007-4-14 20:58
5513
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

int i=0;
int FindFile(char *str);
int main(int argc, char *argv[])
{
  FindFile("e:\\sdk");  // 要递归的起始路径
  getch();
  return 0;
}

int FindFile(char *str)
{
    WIN32_FIND_DATA wfd;
   
    char *str1 = (char *)malloc(strlen(str)+4);
    strcpy(str1,str);
    strcat(str1,"\\*.*");
   HANDLE ff = FindFirstFile(str1,&wfd);
    do{

        if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY &&
           strcmp(wfd.cFileName,".") != 0 &&
           strcmp(wfd.cFileName,"..") != 0 )
        {
           char  *p = (char *)malloc(strlen(str)+strlen(wfd.cFileName)+4);
            if(p == NULL)
                 MessageBox(NULL,"P = NULL","Error",0);
            strcpy(p,str);
            strcat(p,"\\");
            strcat(p,wfd.cFileName);
            puts(p);
            printf("%d\n",i++);
            FindFile(p);              
            
         }
       }while(FindNextFile(ff,&wfd));
    FindClose(ff);
    return 0;
}
在递归中 一般只要目录多与 200 个左右 就会跳出什么0x77880a 不能读
要是200个目录以下 就可以顺利的递归完成
我想是不是栈的容量有限了 溢出了? 望高手解答
  说明 用OD调试 可以把整个盘的目录列出来
       双击运行 不是窗口弹一下就没了 就是 0x7766ab 不是读 什么的

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
#include <windows.h>
#include <stdio.h>

void enum_path(char *cpath){
        WIN32_FIND_DATA wfd;
        HANDLE hfd;
        char cdir[MAX_PATH];
        char subdir[MAX_PATH];
        int r;
        GetCurrentDirectory(MAX_PATH,cdir);
        SetCurrentDirectory(cpath);
        hfd = FindFirstFile("*.*",&wfd);
        if(hfd!=INVALID_HANDLE_VALUE) {
                do{
                        if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                        {
                                if(wfd.cFileName[0] != '.'){
                                        // 合成完整路径名
                                        sprintf(subdir,"%s\\%s",cpath,wfd.cFileName);
                                        // 递归枚举子目录
                                        enum_path(subdir);
                                }
                        }else{
                                printf("%s\\%s\n",cpath,wfd.cFileName);
                                // 打印本次找到的文件路径
                        }
                }while(r=FindNextFile(hfd,&wfd),r!=0);
        }
        SetCurrentDirectory(cdir);
}
void enum_path(char *cpath);
int main(void){
        enum_path("C:\\test\\");
                return 0;
}
2007-4-15 08:50
0
雪    币: 214
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我只想知道我写的代码有什么问题
而不是想递归出目录来
2007-4-15 11:18
0
雪    币: 214
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我自己解决问题了  呵呵
/*
  Name: 剃刀 QQ:82180316
  Copyright: www.Expliot7.cn
  Author:
  Date: 15-04-07 17:15
  用递归遍历目录 比 我上次用链表遍历目录的速度快多了.
*/

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
int FindFile(char *str); //递归函数
int main(int argc, char *argv[])
{
  FindFile("e:\\");  // 要递归的起始路径
  getch();
  return 0;
}

int FindFile(char *str)
{
    WIN32_FIND_DATA wfd;   //定义一个文件结构
    static unsigned long nFileNum; //用来放一共多少个文件夹
    char *str1 = (char *)malloc(strlen(str)+5); //分配空间 把路径转换为 路径\*.* 的格式 要多5个字符
    sprintf(str1,"%s\\*.*",str); //把路径转换为 路径\*.* 的格式 要多5个字符
   
   HANDLE ff = FindFirstFile(str1,&wfd); //查找文件
   if(ff == INVALID_HANDLE_VALUE) return 0; //不是无效句柄 就继续,不然返回
   //这个说明 不是用 ff 跟 0 或 NULL 比较
   //因为这个函数失败是返回 -1 的
   //我就是用 NULL 比较 浪费了好半天时间
   // 原形 #define INVALID_HANDLE_VALUE (HANDLE)-1  
    do{

        if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && //是目录
           strcmp(wfd.cFileName,".") != 0 && //不是 .
           strcmp(wfd.cFileName,"..") != 0 ) //也不是 ..
        {
            char  *p = (char *)malloc(strlen(str)+strlen(wfd.cFileName)+2);
             //分配空间 放路径+但前文件夹名 中间有个 / 所以要多加 2
            sprintf(p,"%s\\%s",str,wfd.cFileName);           
            //把路径+但前文件夹名 放到变量 p
            printf("%-8d%s\n",++nFileNum,p);
            //先打印出路径
            FindFile(p);  
            //用组合好的路径 p 做参数调用递归函数  
            free(p);//这里要释放                     
         }
       }while(FindNextFile(ff,&wfd)); //返回的不为0 就继续找
    FindClose(ff); //找完了 就关闭句柄
    free(str1); // 这里是这里目录调用完后 才释放的
    return 0;
}
2007-4-15 17:22
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
5
要说问题应该是在内存分配上。
    char *str1 = (char *)malloc(strlen(str)+4);
    strcpy(str1,str);

一般是采用数组:

char str1[1024];

而不是分配内存.......

打印文本不需要分配内存,然后要读文件到内存才能malloc。
2007-4-15 17:37
0
游客
登录 | 注册 方可回帖
返回
//