扫描文件目录,把扫描结果保存在链表中。
附上代码:
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
#include<dirent.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<stdlib.h>
#define MAX_LENGTH 20
typedef struct Node
{
char name[MAX_LENGTH];
struct Node *next;
}Node;
typedef struct Node* LinkList;
void clear_list(LinkList *l)
{
LinkList temp,q;
q=(*l)->next;
while(q)
{
temp=q->next;
free(q);
q=temp;
}
(*l)->next=NULL;
}
void print_list(LinkList *l)
{
int k;
LinkList P;
P=(*l)->next;
while(P)
{
for(k=0;k<strlen(P->name);k++)
{
printf("%c",P->name[k]);
}
printf("\n");
P=P->next;
}
}
void scan_dir(char *dir,LinkList *rear)
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
LinkList temp;
int j;
if((dp = opendir(dir))==NULL)
{
puts("无法打开");
return;
}
chdir(dir);
while((entry=readdir(dp))!=NULL)
{
lstat(entry->d_name,&statbuf);
if(S_IFDIR & statbuf.st_mode)
{
if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)
continue;//remove current dir\above dir
temp=(LinkList)malloc(sizeof(Node));
if(!temp)
{
printf("no room\n");
exit(1);
}
for(j=0;j<strlen(entry->d_name);j++)
{
temp->name[j]=entry->d_name[j];
}
temp->name[strlen(entry->d_name)]='\\';
temp->name[strlen(entry->d_name)+1]='\0';
temp->next=NULL;
(*rear)->next=temp;
(*rear)=temp;
scan_dir(entry->d_name,rear);
}
else
{
temp=(LinkList)malloc(sizeof(Node));
if(!temp)
{
printf("no room\n");
exit(1);
}
for(j=0;j<strlen(entry->d_name);j++)
{
temp->name[j]=entry->d_name[j];
}
temp->name[strlen(entry->d_name)]='\0';
temp->next=NULL;
(*rear)->next=temp;
(*rear)=temp;
}
}
chdir("..");
closedir(dp);
}
int main(void)
{
LinkList *h;
LinkList r;
*h=malloc(sizeof(Node));
if(!(*h))
{
printf("no room\n");
clear_list(h);
exit(1);
}
r=*h;
r->next=NULL;
scan_dir("/home/fyp/test",&r);
print_list(h);
clear_list(h);
return 0;
}
运行结果如下: