用C+API对目录下所有文件进行遍历出错,请大虾帮忙

Aaron_Jerry 2007-03-24 11:35:16
我在VC里新建了个控制台应用程序,代码如下:

#include <stdio.h>
#include <string.h>
#include <windows.h>

#define TYPE_FILE 0x0001
#define TYPE_DIRECTORY 0x0002
#define TYPE_DOT 0x0004

//判断类型
int FileType(LPWIN32_FIND_DATA lpfd)
{
BOOL bDir;
int ft=TYPE_FILE;
bDir=(lpfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
if(bDir)
{
if((lstrcmp(lpfd->cFileName,".")==0)
|| (lstrcmp(lpfd->cFileName,"..")==0))
ft=TYPE_DOT;
else
ft=TYPE_DIRECTORY;
}
return ft;
}

void ShowDir(char* dir)
{
HANDLE hFile;
WIN32_FIND_DATA fd;
BOOL ret;
char parent[_MAX_PATH];
char fullpath[_MAX_PATH];
int i;
int filetype;

for(i=0; dir[i]; i++);
if(dir[i-1] != '\\')
strcat(dir,"\\");
strcpy(parent,dir);
strcpy(fullpath,dir);
strcat(dir,"*.*");

ZeroMemory(&fd,sizeof(WIN32_FIND_DATA));
hFile=FindFirstFile(dir,&fd);
while(ret=FindNextFile(hFile,&fd))
{
filetype=FileType(&fd);
if(filetype==TYPE_FILE)
{
strcat(fullpath,fd.cFileName);
printf("%s\n",fullpath);
strncpy(fullpath,parent,strlen(parent));
fullpath[strlen(parent)]='\0';
}
else if(filetype==TYPE_DOT)
continue;
else
{
strcat(fullpath,fd.cFileName);
ShowDir(fullpath);
}
}
FindClose(hFile);
}

int main(void)
{
char path[_MAX_PATH];
printf("请输入一个目录名:");
gets(path);
printf("该目录下的所有文件:\n");
ShowDir(path);

return 0;
}

例如我的硬盘上有如下文件结构:

D---001----001.c
|
-wsp001.dsp
|
-wsp001.dsw
|
-wsp001.ncb
|
-wsp001.opt
|
-wsp001.plg
|
-debug -------001.obj
|
-vc60.idb
|
-vc60.pdb
|
-wsp001.exe
|
-wsp001.ilk
|
-wsp001.pch
|
-wsp001.pdb
|
-a.txt
|
-b.txt

执行如下:

请输入一个目录名:D:\001
该目录下的所有文件:
D:\001\001.c
D:\001\Debug\001.obj
D:\001\Debug\a.txt
D:\001\Debug\b.txt
D:\001\Debug\vc60.idb
D:\001\Debug\vc60.pdb
D:\001\Debug\wsp001.exe
D:\001\Debug\wsp001.ilk
D:\001\Debug\wsp001.pch
D:\001\Debug\wsp001.pdb
D:\001\Debug\*.*wsp001.dsp //why ?????????
D:\001\wsp001.dsw
D:\001\wsp001.ncb
D:\001\wsp001.opt
D:\001\wsp001.plg
Press any key to continue


请大峡们指点下 本程序不涉及MFC
...全文
387 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
gscool 2007-03-25
  • 打赏
  • 举报
回复
这样试试

#include <stdio.h>
#include <string.h>
#include <windows.h>

#define TYPE_FILE 0x0001
#define TYPE_DIRECTORY 0x0002
#define TYPE_DOT 0x0004

//判断类型
int FileType(LPWIN32_FIND_DATA lpfd)
{
BOOL bDir;
int ft=TYPE_FILE;
bDir=(lpfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
if(bDir)
{
if((lstrcmp(lpfd->cFileName,".")==0)
|| (lstrcmp(lpfd->cFileName,"..")==0))
ft=TYPE_DOT;
else
ft=TYPE_DIRECTORY;
}
return ft;
}

void ShowDir(char* dir)
{
HANDLE hFile;
WIN32_FIND_DATA fd;
BOOL ret;
char parent[_MAX_PATH];
char fullpath[_MAX_PATH];
int i;
int filetype;

for(i=0; dir[i]; i++);
if(dir[i-1] != '\\')
strcat(dir,"\\");
strcpy(parent,dir);
strcpy(fullpath,dir);
strcat(dir,"*.*");

ZeroMemory(&fd,sizeof(WIN32_FIND_DATA));
hFile=FindFirstFile(dir,&fd);
while(ret=FindNextFile(hFile,&fd))
{
filetype=FileType(&fd);
if(filetype==TYPE_FILE)
{
printf("%s\%s\n",parent,fd.cFileName);
strncpy(fullpath,parent,strlen(parent));
fullpath[strlen(parent)]='\0';
}
else if(filetype==TYPE_DOT)
continue;
else
{
strcat(fullpath,fd.cFileName);
ShowDir(fullpath);
}
}
FindClose(hFile);
}

int main(void)
{
char path[_MAX_PATH];
printf("请输入一个目录名:");
gets(path);
printf("该目录下的所有文件:\n");
ShowDir(path);

return 0;
}
Aaron_Jerry 2007-03-25
  • 打赏
  • 举报
回复
谢谢两位的热心答复。
还有一问不解:执行的输出列表中的文件顺序好象并不和硬盘上的文件顺序一致啊,why?

jixingzhong 2007-03-25
  • 打赏
  • 举报
回复
或者这样:

long handle;
struct _finddata_t filestruct;  
char path_search[_MAX_PATH];
handle = _findfirst("目录",&filestruct);
if((handle == -1)) return;
if( ::GetFileAttributes(filestruct.name)& FILE_ATTRIBUTE_DIRECTORY )
{
if( filestruct.name[0] != '.' )
{
_chdir(filestruct.name);
Search_Directory(szFilename);
_chdir("..");
}
}
else
{
if( !stricmp(filestruct.name, szFilename) )
{
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
MessageBox(path_search);
}
}
while(!(_findnext(handle,&filestruct)))
{
  if( ::GetFileAttributes(filestruct.name) &FILE_ATTRIBUTE_DIRECTORY )
{
if(*filestruct.name != '.')
{
_chdir(filestruct.name);
Search_Directory(szFilename);
_chdir("..");
}
else
{
if(!stricmp(filestruct.name,szFilename))
{
_getcwd(path_search,_MAX_PATH);
strcat(path_search,"\\");
strcat(path_search,filestruct.name);
MessageBox(path_search);
}
}
}
_findclose(handle);
}
jixingzhong 2007-03-25
  • 打赏
  • 举报
回复
Dev C++ 测试通过:

利用链表实现目录内所有文件列表显示

#include <stdio.h>
#include <dirent.h>
/*#include <alloc.h>*/
#include <string.h>

void main(int argc,char *argv[])
{
DIR *directory_pointer;
struct dirent *entry;
struct FileList
{
char filename[64];
struct FileList *next;
}start,*node;
if (argc!=2)
{
printf("Must specify a directory\n");
exit(1);
}
if ((directory_pointer=opendir(argv[1]))==NULL)
printf("Error opening %s\n",argv[1]);
else
{
start.next=NULL;
node=&start;
while ((entry=readdir(directory_pointer))!=NULL)
{
node->next=(struct FileList *)malloc(sizeof(struct FileList));
node=node->next;
strcpy(node->filename,entry->d_name);
node->next=NULL;
}
closedir(directory_pointer);
node=start.next;
while(node)
{
printf("%s\n",node->filename);
node=node->next;
}
}
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧