Daisd-CHN 2023-12-01 11:28 采纳率: 33.3%
浏览 5

实现一个简易的du命令



#include<stdio.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<unistd.h>
#include<string.h>
#include<glob.h>

#define PATHSIZE 1024

//判断是否是在 . 还是 .. 防止mydu进入死循环
static int path_noloop(const char *path)
{
    char *pos;
    pos = strrchr(path,'/');
    if(pos == NULL)
    {
        return 0;
    }
    if(strcmp(pos + 1,".") == 0 || strcmp(pos+1,"..") == 0)
    {
        return 0;
    }
    return 1;
}


static int64_t mydu(const char *path)
{
    static struct stat statres;
    static char nextpath[PATHSIZE];
    glob_t globrest;
    int64_t sum ;    //解析到的文件的block大小总值
    int ret = 0,i;
    if(lstat(path,&statres) < 0)
    {
        perror("lstat()");
        exit(1);
    }
    if(!S_ISDIR(statres.st_mode))    //如果是目录文件就直接返回block大小
    {
        return statres.st_blocks * 512 / 1024;
    }
    //把非隐藏的文件都解析到了globrest中
    strncpy(nextpath,path,PATHSIZE);
    strncat(nextpath,"/*",PATHSIZE);
    ret = glob(nextpath,0,NULL,&globrest);
    if(ret)
    {
        printf("Error code = %d\n",ret);
        exit(1);
    }
    strncpy(nextpath,path,PATHSIZE);
    strncat(nextpath,"/.*",PATHSIZE);
    //将解析到的隐藏文件追加到globrest中
    ret = glob(nextpath,GLOB_APPEND,NULL,&globrest);
    if(ret)
    {
        printf("Error code1 = %d\n",ret);
        exit(1);
    }
    sum = statres.st_blocks;
    for(i = 0;i < globrest.gl_pathc;i++)
    {
        if(path_noloop(globrest.gl_pathv[i]))
        {
            //递归将glorest中的文件block数累加
            sum += mydu(globrest.gl_pathv[i]);
        }
        
    }
    globfree(&globrest);
    return sum * 512 / 1024;
}


int main(int argc,char **argv)
{

    if(argc < 2)
    {
        fprintf(stderr,"Usage.....\n");
        exit(1);
    }
    printf("%ld KB\t %s\n",mydu(argv[1])/2,argv[1]);


    exit(1);
}

img


请问为什么要查看其他目录时会报错。

img


请各位帮忙解释一下,看半天看不出个所以然

  • 写回答

3条回答 默认 最新

  • 柯本 2023-12-01 12:47
    关注

    目前后面没人文件就会报这个,加个 GLOB_NOCHECK

        ret = glob(nextpath,GLOB_NOCHECK,NULL,&globrest);
    。。。
        ret = glob(nextpath,GLOB_APPEND | GLOB_NOCHECK,NULL,&globrest);
    
    

    当然还会执行到perror,把那个也直接return 0;你程序就可运行了

    评论

报告相同问题?

问题事件

  • 创建了问题 12月1日

悬赏问题

  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画
  • ¥15 hadoop中启动hive报错如下怎么解决
  • ¥15 如何优化QWebEngineView 加载url的速度
  • ¥15 关于#hadoop#的问题,请各位专家解答!
  • ¥15 如何批量抓取网站信息
  • ¥15 Spring Boot离线人脸识别
  • ¥15 使用Ant Design Pro vue的时候,使用环境变量的时候,构建报错是什么原因