#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/stat.h>
#include<string.h>
#include<fcntl.h>
#include<dirent.h>
//利用深度优先遍历实现文件检索
void dfs(const char *filedir)
{
struct stat dirstat;
if(stat(filedir,&dirstat)==-1)
{
printf("cant access to %s",filedir);
exit(1);
}
if(dirstat.st_mode & S_IFDIR)
{
struct dirent *entry;
DIR * dir;
dir = opendir(filedir);
printf("%s\n",filedir);
while((entry = readdir(dir))!=NULL)
{
if(!strcmp(entry->d_name,".")||!strcmp(entry->d_name,".."))continue;
char src[255];
strcpy(src,filedir);
strcat(src,"/");
chdir(strcat(src,entry->d_name));
dfs(src);
chdir(filedir);
}
}
else
{
printf("--%s\n",filedir);
}
}
int main(int argc,char *args[])
{
if(argc!=2)
{
printf("tree filedir");
}
dfs(args[1]);
return 0;
}
在Linux下检索文件跟windows下一样,只不过文件结构稍有不同,需要了解linux下的文件存储方式
struct stat 是一个指向文件指针的结构体。查看stat的信息可以通过man 2 struct stat查看 如下
struct stat { /* when _DARWIN_FEATURE_64_BIT_INODE is NOT defined */
dev_t st_dev; /* device inode resides on */
ino_t st_ino; /* inode's number */
mode_t st_mode; /* inode protection mode */
nlink_t st_nlink; /* number of hard links to the file */
uid_t st_uid; /* user-id of owner */
gid_t st_gid; /* group-id of owner */
dev_t st_rdev; /* device type, for special file inode */
struct timespec st_atimespec; /* time of last access */
struct timespec st_mtimespec; /* time of last data modification */
struct timespec st_ctimespec; /* time of last file status change */
off_t st_size; /* file size, in bytes */
quad_t st_blocks; /* blocks allocated for file */
u_long st_blksize;/* optimal file sys I/O ops blocksize */
u_long st_flags; /* user defined flags for file */
u_long st_gen; /* file generation number */
};
我们可以通过获得stat的一些属性知道inode 号和记录属性等,inode记录文件位置等信息,从而找到磁盘中的数据。在这里我们用stat的属性区分文件还是文件夹,然后利用opendir获取文件目录,readdir依此读取目录中文件。如有疑问或者错误欢迎大家留言讨论,原创 转载请说明出处