能力值:
( 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;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我只想知道我写的代码有什么问题
而不是想递归出目录来
|
能力值:
( 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;
}
|
能力值:
( LV9,RANK:380 )
|
-
-
5 楼
要说问题应该是在内存分配上。
char *str1 = (char *)malloc(strlen(str)+4);
strcpy(str1,str);
一般是采用数组:
char str1[1024];
而不是分配内存.......
打印文本不需要分配内存,然后要读文件到内存才能malloc。
|
|
|