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

你可能感兴趣的:(C++,c,linux,windows,C#)