Linux下简单的目录扫描程序

扫描文件目录,把扫描结果保存在链表中。
附上代码:

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

运行结果如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/lf960731/article/details/81239098