C遍历文件目录


// 递归遍历某一路径下的所有文件
  //
  //在windows下,可以使用FindFirstFile和FindNextFile来实现。
  //
  //而在Linux下,则可以使用opendir和readdir来实现。
  //
  //具体实现见下面两个函数,分别实现了打印某一路径下的所有文件,包括子目录下的文件。在具体实现的时候需要注意设置路径。
  //
  //注:
  //
  //下面两个程序都通过编译通过,且正常执行。
  //windows下使用VC6.0编译;
  //Linux下使用gcc 3.4.3编译。
  
  //for windows
void findAllFile(char * pFilePath){
  
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char DirSpec[MAX_PATH + 1]; // directory specification
DWORD dwError;   
strncpy (DirSpec, pFilePath, strlen(pFilePath) + 1);
SetCurrentDirectory(pFilePath);
strncat (DirSpec, "\\*", 3);
hFind = FindFirstFile(DirSpec, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE){
printf ("Invalid file handle. Error is %u\n", GetLastError());
return ;
}
else{
if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY ){
printf ("  %s\n", FindFileData.cFileName);
}
else if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY&& strcmp(FindFileData.cFileName, ".") != 0&& strcmp(FindFileData.cFileName, "..") != 0){
char Dir[MAX_PATH + 1];
strcpy(Dir, pFilePath);
strncat(Dir, "\\", 2);
strcat(Dir, FindFileData.cFileName);
findAllFile(Dir);
} 
while (FindNextFile(hFind, &FindFileData) != 0){
if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY){
printf ("  %s\n", FindFileData.cFileName);
}
else if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY&& strcmp(FindFileData.cFileName, ".") != 0&& strcmp(FindFileData.cFileName, "..") != 0){
char Dir[MAX_PATH + 1];
strcpy(Dir, pFilePath);
strncat(Dir, "\\", 2);
strcat(Dir, FindFileData.cFileName);
findAllFile(Dir);
}   
} 
dwError = GetLastError();
FindClose(hFind);
if (dwError != ERROR_NO_MORE_FILES) {
printf ("FindNextFile error. Error is %u\n", dwError);
return;
}
}
}
  
  //for linux
void findAllFile(char * pFilePath){
DIR * dir;
dirent * ptr;
struct stat stStatBuf;
chdir(pFilePath);
dir = opendir(pFilePath);
while ((ptr = readdir(dir)) != NULL){
if (stat(ptr->d_name, &stStatBuf) == -1){
printf("Get the stat error on file:%s\n", ptr->d_name);
continue;
}
if ((stStatBuf.st_mode & S_IFDIR) && strcmp(ptr->d_name, ".") != 0&& strcmp(ptr->d_name, "..") != 0){
char Path[MAX_PATH];
strcpy(Path, pFilePath);
strncat(Path, "/", 1);
strcat(Path, ptr->d_name);
findAllFile(Path);
}
if (stStatBuf.st_mode & S_IFREG){
printf(" %s\n", ptr->d_name);
}
//this must change the directory , for maybe changed in the recured function
chdir(pFilePath);
}
closedir(dir);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值