扫描指定目录以及子目录下的所有文件并打印绝对路径

void scan_dir(char *dir)   // 定义目录扫描函数  
{
	DIR *dp;                      // 定义子目录流指针  
	struct dirent *entry;         // 定义dirent结构指针保存后续目录  
	struct stat statbuf;          // 定义statbuf结构保存文件属性  
	char abspath[512] = { 0 };
	if ((dp = opendir(dir)) == NULL) // 打开目录,获取子目录流指针,判断操作是否成功  
	{
		fprintf(stderr, "can't open dir:---%s\n", dir);
		return;
	}
	while ((entry = readdir(dp)) != NULL)  // 获取下一级目录信息,如果未否则循环  
	{
		if (strcmp(".", entry->d_name) == 0 || strcmp("..", entry->d_name) == 0|| strcmp("\$antiy_virus_backup\$", entry->d_name) == 0)//如果遇到.文件夹..文件夹还有$antiy_virus_backup$文件夹就跳过进入下一个循环
			continue;
		sprintf(abspath, "%s/%s", dir, entry->d_name);
		lstat(abspath, &statbuf); // 获取下一级成员属性  
		if (S_ISDIR(statbuf.st_mode))
		{
			scan_dir(abspath);              // 递归调用自身,扫描下一级目录的内容  
		}
		else
			printf("%s\n", abspath);
	}                                               // 回到上级目录  
	closedir(dp);                                                 // 关闭子目录流  
}

int main(int argc, char* argv[])
{
	char *topdir = ".";
 
	if (argc >= 2)
	{
		topdir = argv[1];
	}
	printf("-----------------Scan File Full Dir: %s-----------------\n", topdir);
	scan_dir(topdir);
	puts("-------------------Scan over...!!!------------------------");
	return 0;
}

遍历子目录用的方法是递归调用,先判断子目录流指针所指向的文件是否为目录文件。如果是,该函数将调用自身去遍历子目录;如果不是,则输出文件名,继续遍历当前目录,直到子目录流指向NULL。

子目录流操作相关函数:
DIR *OPENDIR(const char *name);    // 打开路径并建立子目录流,返回子目录流指针
struct dirent *readdir(DIR *dirp);          // 函数返回一个指针,指针指向的结构里保存着子目录流dirp中下一个目录数据项的有关资料。后续的readdir调用将返回后续的目录数据。如果错误或达到了目录尾,将返回NULL值
long int telldir(DIR *dirp);                      // 函数返回值里记录着子目录流里的当前位置
void seekdir(DIR *dirp, long int loc);    // 对dirp指定的子目录流中的目录数据项的指针进行设置。loc的值用来设置指针位置,它应该通过前一个telldir调用获得
int closedir(DIR *dirp);                          // 关闭子目录流,返回关闭操作结果

你可能感兴趣的:(c/c++)