Linux遍历目录实现 tree功能

Linux目录遍历主要分为三步

  • 打开目录
  • 读取目录
  • 关闭目录


    617813-2dfcc142fad025d8.png

#include <sys/stat.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#define args_check(argc,num) {if(argc!=num) {printf("error args\n");return -1;}}

//目录深度优先遍历
void printdir(char * dirname,int width)  //递归调用自己
{
    DIR *pdir;  //定义DIR类型变量这是opendir的返回值
    pdir=opendir(dirname); //打开目录
    if(NULL==pdir) //若传参不正确
    {
        perror("opendir"); //返回opdir错误在哪里
        return;
    }
    struct dirent *p; //定义dirent类型指针为了获取某文件夹目录内容,所使用的结构体
    char path[512]={0}; //定义目录字符串
    
    while((p=readdir(pdir))!=NULL) //readdir读取目录的返回值为一个dirent类型的指针
    {
        if(!strcmp(p->d_name,".")||!strcmp(p->d_name,"..")) 
        {
            continue; //跳过当前目录和上一级目录,避免无限循环
        }
        printf("%*s%s\n",width,"",p->d_name); //printf 打印空格
        if(p->d_type==4)  //d_type的枚举类型值表示一个类型4是目录,0是未知,1是管道,2是字符设备,8表示文件,6是块设备
        {
            sprintf(path,"%s%s%s",dirname,"/",p->d_name);//sprintf将三个字符串拼接起来
            printdir(path,width+4); //递归调用自己,下一层目录前面打印空格多4个
        }
    }
    closedir(pdir);
}

int main(int argc,char *argv[])
{
    args_check(argc,2); //此处定义为宏,判断传入参数
    printf("%s\n",argv[1]); //打印传入目录
    printdir(argv[1],4); //调用递归函数
    return 0;
}

磁盘删除只是删除了dirent信息 除非下一次再写入文件到那个位置的时候就会

文件剪切只是创建了一个硬链接和copy有很大不同,速度快的多

猜你喜欢

转载自blog.csdn.net/weixin_34204057/article/details/87088005