遞迴遍曆某一路徑下的所有檔案
在windows下,可以使用FindFirstFile和FindNextFile來實現。
而在Linux下,則可以使用opendir和readdir來實現。
具體實現見下面兩個函數,分別實現了列印某一路徑下的所有
檔案,包括子目錄下的檔案。在具體實現的時候需要注意設定路徑。
註:
下面兩個程式都通過編譯通過,且正常執行。
windows下使用VC6.0編譯;
Linux下使用gcc 3.4.3編譯。
#include <stddef.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h> // stat 函數所在的檔案
#include <dirent.h>
//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);
}
URL:http://blog.csdn.net/jiangxinyu/archive/2007/06/11/1647951.aspx