首页  人才招聘  项目交易  BLOG  兴趣小组  图书  资讯  文章  下载  源码  网友作品  刻盘服务 

您所在位置:论坛首页 — 如何用C实现遍历文件夹?
打印本页 保存页面
 如何用C实现遍历文件夹?

我是个C语言的初学者   才开始写东西
最近准备写个批量文件更新工具
想遍历文件夹   在网上也找到很多代码
但是没有C的   C++的用CFree单独编译可以运行
但是和C的代码一起编译  就出错
看过C++的代码  是用FindFirstFile和FindNextFile两个函数进行递归
完成功能的  但是在C的函数库里没有找到这类搜索文件的函数
希望高手能指点下
不胜感激
 回复内容
【akirya】:
标准C是没有目录相关的函数的
CFree是16位的吧,那就更不用想了.貌似只能内嵌汇编使用dos中断来完成.

还是换编译器吧devcpp codeblock vc8 之类的都很好

【cmail】:
这个要用到windows API

HANDLE FindFirstFile(
  LPCTSTR lpFileName,
  LPWIN32_FIND_DATA lpFindFileData
);

BOOL FindNextFile(
  HANDLE hFindFile,
  LPWIN32_FIND_DATA lpFindFileData
);

WIN32_FIND_DATA

【CHROX】:
在Win32平台下不用windows api,有好多功能实现起来都很费劲,特别是系统相关的
再说用api又不是什么丢人的事。开发可移植程序除外。
用FindFirstFile和FindNextFile两个api很容易实现
////////////////////////////////////////////////
void FindFile(LPCTSTR lpszPath) {   
    TCHAR szFind[MAX_PATH];   
    lstrcpy(szFind,lpszPath);
   
    if(!IsRoot(szFind)) lstrcat(szFind,"\\");   
    lstrcat(szFind,"*.*");   
    WIN32_FIND_DATA wfd;   
    HANDLE hFind=FindFirstFile(szFind,&wfd);
   
    if(hFind==INVALID_HANDLE_VALUE)   return;   
    do{   
        if(lstrcmp(wfd.cFileName,".")==0||lstrcmp(wfd.cFileName,"..")==0)   continue;   
char  szFile[MAX_PATH];   
lstrcpy(szFile,lpszPath);   
if(!IsRoot(szFile)) lstrcat(szFile,"\\");   
lstrcat(szFile,wfd.cFileName);   
if((GetFileAttributes(szFile)&FILE_ATTRIBUTE_DIRECTORY)==FILE_ATTRIBUTE_DIRECTORY){   
FindFile(szFile);   //递归 
}
else { 
} //Do   your   things   
}   
} while (FindNextFile(hFind,&wfd));   
CloseHandle(hFind);   
}

【Geomatic】:
原来FindFirstFile和FindNextFile是WINDOWS的API   我晕   我以为是C++的函数库里的东西呢
我明白了     我找到的代码和CHROX的差不多
#include <stdio.h>
#include <windows.h>

BOOL IsRoot(LPCTSTR lpszPath)
{
TCHAR szRoot[4];
wsprintf(szRoot, "%c:\\", lpszPath[0]);
return (lstrcmp(szRoot, lpszPath) == 0);
}

void FindInAll(::LPCTSTR lpszPath)
{TCHAR szFind[MAX_PATH];
lstrcpy(szFind, lpszPath);
if (!IsRoot(szFind))
lstrcat(szFind, "\\");
lstrcat(szFind, "*.*"); // 找所有文件
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(szFind, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return;

do
{
if (wfd.cFileName[0] == '.')
continue; // 过滤这两个目录
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
FindInAll(szFile); // 如果找到的是目录,则进入此目录进行递归
}
else
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
printf("%s\n",szFile);
// 对文件进行操作
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄

}
int main(int argc, char* argv[])
{
FindInAll("g://music");
return 0;
}
谢谢大家的帮助

【Geomatic】:
这个怎么给你们给分啊  
那个分有用吗  
刚申请的  好多功能不会用啊

【cmail】:
点上面的“管理”。

【CHROX】:
分可是个好东西。呵呵,你以后就明白了。

【jixingzhong】:
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;
    }
  }
}


【jixingzhong】:
linux下面的,作者不是我

A Demo written by camelrain 

/*
the program find  a  file  from  current  directory  or  your defined  directory
commond  optinon [path]  filename
*/
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pwd.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

#define LENGTH  256

/* just if is a directory*/
static  int   IsDir (char * name);
/* search target file, arg1 is current path, arg2 is target  file*/
static  void  search_file (char * path, char * name);

static  int   search_flag=0;


/*just  if is a  directory*/
static  int  IsDir (char * name) {
   struct  stat  buff;  
 
   if (lstat(name,&buff)<0)
      return 0; //if not exist name ,ignore

   /*if is directory return 1 ,else return 0*/ 
   return S_ISDIR(buff.st_mode);
}


/*search  target file*/
static  void search_file (char * path, char * name) {
   DIR         *directory;
   struct      dirent * dir_entry;
   char        buffer[LENGTH];

   if ((directory=opendir(path)) == NULL) {
       fprintf(stderr, "%s", path);
       perror(" ");
       return;
   }
   

   while (dir_entry=readdir(directory)) {
     if  (!strcmp(dir_entry->d_name,".")||!strcmp(dir_entry->d_name,"..")) {
              /*  do    nothing*/
     }
     else {
           /* if is  boot  directory  add  "/" */
           if ((strcmp(path,"/"))==0)
              sprintf(buffer,"%s%s",path,dir_entry->d_name);
           /*  if is not  boot  directory do not add "/"*/
           else
              sprintf(buffer,"%s/%s",path,dir_entry->d_name);

           //printf("Now  file : %s\n",buffer);
           if (IsDir(buffer))
               search_file (buffer , name);
           else {
               if (strcmp(dir_entry->d_name,name)==0)
                 {
                  printf("%s\n",buffer);
                  search_flag=1;
                 }
            }
      }
    }
  closedir(directory);
}

int main(int argc, char *argv[])
{
   static  char * current_dir;
   static  char * filename; 
   int     length;

   if (argc==1) {
         printf("A few  parameters!!\n");
         return 0;
      }

   if (argc==2) {
        current_dir=(char * )getcwd(current_dir,LENGTH);
        filename=argv[1];
      }

   if (argc==3) {
        length=strlen(argv[1]);

        if (length>1 && (argv[1][length-1]=='/')) {
               argv[1][length-1]='\0';
               //printf("%d\n",strlen(argv[1]));
           }
           
        current_dir=argv[1];
        filename=argv[2];
      }
 
   search_file(current_dir,filename);

   if (!search_flag)
      printf("Not found this(%s)  file!\n",filename);

 return 0;
}

【jixingzhong】:
VC 下的:

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); 
}

【fengdream】:
强贴,留名,学习了...

【empireconquer】:
全是四星级的,收藏

【czdj2000】:
收藏了 多谢瞌睡虫

【rainstormed】:
都写得很清楚了

广告
 
最新招聘信息

关于本站 - 网站导航 - 联系站长 - BUG报告 - 友情链接 - 赞助本站
Copyright© 1999-2008 Programfan.com. All Rights Reserved
论坛制作&维护:Hannibal    Email: webmaster@pfan.cn
最佳浏览效果:IE6.0+ 或 FireFox 1.5+ 分辨率:1024*768