linux获取目录下文件列表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#include
int fileSize(char fileName[]);
//文件信息
typedef struct fileinfo{
char name[256];
char fullName[1024];
int size;
time_t mod_time;
char type[10];
}fileinfo;
//文件列表
typedef struct filelist
{
fileinfo file;
struct filelist* nextfile;
}fileList;
//function getfilelist
//输入目录名
//输出目录下的文件列表头指针
fileList * getFileList(char name[1024])
{
fileList *head=NULL;
fileList *cur=NULL;
char name_temp[1024];
//目录
DIR * dir;
//目录环境
struct dirent *dir_env;
//文件描述
struct stat stat_file;
//初始化head
head =(fileList*)malloc(sizeof(fileList));
head->nextfile = NULL;
//打开目录
dir=opendir(name);
while(dir_env=readdir(dir))//读文件描述表
{
//排除.和..
if(strcmp(dir_env->d_name,".")==0 || strcmp(dir_env->d_name,"..")==0)
continue;
//把文件全名保存到新变量
strcpy(name_temp,name);
strcat(name_temp,dir_env->d_name);
stat(name_temp,&stat_file);//获取文件描述信息
//将文件信息存放到链表中
//产生临时节点
cur=(fileList*)malloc(sizeof(fileList));
//cur赋值
//文件名,fullName=cur_dir+"name";
strcpy(cur->,dir_env->d_name);
strcpy(cur->file.fullName,name_temp);
//文件大小
//文件类型
if( S_ISDIR(stat_file.st_mode))
{
cur->file.size = 0;
strcpy(cur->file.type,"mulu");
strcat(cur->file.fullName,"/");
}else
{
cur->file.size = stat_file.st_size;
strcpy(cur->file.type,"file");
}
//修改日期
cur->file.mod_time = ctime(&stat_file.st_mtime);
//将临时节点插入head中
if(head->nextfile ==NULL)
{
head->nextfile = cur;
cur->nextfile = NULL;
}else
{
cur->nextfile = head->nextfile;
head->nextfile = cur;
}
}
return head;
}
//showAllNode
//输入:目录
//输出:次目录下所有的文件,和所有目录之下的文件
void showAllNode(fileList *head)
{
fileList * temp;
//数组索引
int i=0,j=0;
//如果head为空,直接返回
fileList * headArray[1024];
if(head == NULL)
return;
//输出当前目录
printf("%s ",head->file.fullName);
printf("\n");
//输出head中的文件
temp =head->nextfile;
while(temp)
{
//判断是否为文件,是文件显示文件
//若为目录,将目录名放入队列,求队列目录
if (strcmp(temp->file.type,"file")==0)
{
printf("file:%s ",temp->file.f
ullName);
}else{
if(i>=1024)
{
printf("there are too many direcotry\n");
return;
}
//头节点初始化
headArray[i] = getFileList(temp->file.fullName);
//头节点名称
strcpy(headArray[i]->file.fullName,temp->file.fullName);
i++;
}
temp=temp->nextfile;
}
//对目录队列中目录使用递归,直到结束
for(j=0;jshowAllNode(headArray[j]);
return;
}
//showList
//输入:列表头
//输出:显示列表,返回void
void showList(fileList * head)
{
//判断head 是否为空,若为空直接返回
if(head == NULL)return;
//若不为空则显示它的内容
while(head)
{
printf("%s\n",head->file.fullName);
head = head->nextfile;
}
return ;
}
int main(int argc,char*argv[])
{
fileList *mylist;
//显示的目录
char name[1024]="/home/mingming/mm/";
if(argc==2)
strcpy(name,argv[1]);
else
strcpy(name,"/home/mingming/mm/");
//取得目录下文件
//头指针传递的目录或者文件名
mylist =getFileList(name);
strcpy(mylist->file.fullName,name);
//显示目录下文件
//showList(mylist);
//显示目录下所有文件
showAllNode(mylist);
printf("\n");
return 0;
}