linux下使用glob()实现打开任意目录下的所有文件

2023-11-06

linux下使用glob()实现打开任意目录下的所有文件

(使用递归)
参考了linux glob函数详解的实例4


  • 编程思路
    第一次调用glob获取当前目录下所有非隐藏文件,若此次目录文件下没有非隐藏文件,但却可能只有隐藏文件,接着第二次调用glob,此次将获取隐藏文件,若此次调用glob出错则返回一个非零值停止程序;未出错则开始循环遍历gl_pathv数组,判断此次文件是否是目录文件,若不是则直接打印此次文件名,若是目录文件则打印文件名加上这是目录文件提示信息,然后还得判断此次文件名是否是.(当前目录)或是..(上级目录),若是则跳过此次循环进入下一轮循环,若不是则递归调用此函数,并判断返回值,若是非零值则立即停止;循环遍历gl_pathv数组结束时,通过调用globfree释放glob产生的动态内存,最后返回零,表示此函数正常结束。

代码:

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

#define SIZE 100

_Bool open_all_file(const char *dirname);

int main(int argc, char **argv)
{
    if(2!=argc)
    {
        printf("invalid parameter!\n");
        return 0;
    }
    if(open_all_file(*(argv+1)))
        printf("open_all_file error!\n");
    return 0;
}

_Bool open_all_file(const char *dirname)
{
    char path[SIZE];    //缓存路径 
    glob_t glob_buf;
    struct stat file_info;
    int result=0; 
    int path_len=0;
    int i=0;

    strcpy(path, dirname);
    if('/'==*(path+strlen(path)-1))
        strcat(path, "*");
    else
        strcat(path, "/*");
    if(result=glob(path, 0, NULL, &glob_buf))
    {
        if(GLOB_NOMATCH==result)
            ;   //此次目录下只有隐藏文件,不立即返回,而是继续去获取隐藏文件 
        else
            return 1;   //其他情况则退出 
    }

    memset(path, 0, strlen(path)+2);    //清空上次缓存的路径 +2是算上之前添加的*或/*  
    strcpy(path, dirname);
    if('/'==*(path+strlen(path)-1))      
        strcat(path, ".*");
    else
        strcat(path, "/.*");
    if(glob(path, GLOB_APPEND, NULL, &glob_buf))    //获取隐藏文件 
    {
        printf("glob 1 error\n");   //只要出错打印提示信息便立即退出 
        return 1;
    }
    //for(i=0;i<glob_buf.gl_pathc;i++)
    while(i<glob_buf.gl_pathc)
    {
        if(-1==lstat(*(glob_buf.gl_pathv+i), &file_info))    
        {
            perror("lstat");
            return 1;
        }
        //if(1==S_ISDIR(file_info.st_mode))         //两种均可 
        if(S_IFDIR==(file_info.st_mode&S_IFMT))     //判断是否是目录文件 
        {
            printf("\n%s :this is directoty!\n", *(glob_buf.gl_pathv+i));
            path_len=strlen(*(glob_buf.gl_pathv+i));
            if('.'==*(*(glob_buf.gl_pathv+i)+path_len-1))//此次文件名的最后一位是.便跳过,读取下一个文件 
            {
                i++;        //如果是for循环则不需要 
                continue;
            }
            if(open_all_file(*(glob_buf.gl_pathv+i)))
            {
                printf("in open_all_file error!\n");
                return 1;                       //出错立即退出 
            }
        }   
        else
            printf("%s\n", *(glob_buf.gl_pathv+i));
        i++;                //如果是for循环则不需要 
    }
    globfree(&glob_buf);    
    return 0;
}
  • PS:
    第一次写博客,还是学生,给自己做的笔记吧。。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux下使用glob()实现打开任意目录下的所有文件 的相关文章

随机推荐

  • gcc 与 g++ 的区别

    gcc 和 g GCC GNU Compiler Collection GUN 编译器集合 g 是 GCC 中的 GUN C Compiler C 编译器 在已编译好的 C 或者 C 代码的前提下 GCC 编译器已提供了调用接口 可以通过执
  • matlab循环每次循环都把结果输出来,怎么把循环的每一步结果都保存下来啊

    本帖最后由 芒点DK 于 2016 12 9 11 04 编辑 各位前辈请看我的代码 clear workspaces clear clc define variables rmin 0 rmax 8 N 9 dt 1 t 0 tmax 1
  • Flutter: 为字体增加渐变色描边

    文章目录 写在前面 内容 实现描边 实现渐变 一些调整 参考 写在前面 实现如下图的效果 这个数字的内部和外部都有渐变色 内容 实现描边 在网上搜索一轮 可以看到通过用 Stack 来让两个 Text叠加 并对上一个 Text设置外部描边
  • Java接口和多态

    Java接口 Java中的接口是一种定义了一组方法签名的抽象类型 它提供了一种方式来定义类之间的协议 即类应该实现哪些方法 在本教程中 我们将探讨Java中接口的使用和实现 步骤1 定义接口 我们首先需要定义一个接口 接口使用interfa
  • 27 KVM管理系统资源-管理虚拟CPU份额

    文章目录 27 KVM管理系统资源 管理虚拟CPU份额 27 1 概述 27 2 操作步骤 27 KVM管理系统资源 管理虚拟CPU份额 27 1 概述 虚拟化环境下 同一主机上的多个虚拟机竞争使用物理CPU 为了防止某些虚拟机占用过多的物
  • 什么是ARM TCM内存

    什么是ARM处理器上的TCM内存 它是一个驻留在处理器旁边的专用内存 还是一个配置为TCM 的RAM区域 如果它是专用内存 为什么我们可以配置它的位置和大小 TCM Tightly Coupled Memory是一个 或多个 小的专用内存区
  • iOS视频列表开发总结

    最近开发了一个较大的需求 即视频列表 特点是每个视频卡片高度不一致 包含不同的元素 若卡片长度超过一屏 还需要将底部的操作栏悬浮 可以上滑下滑自动切换到下一个播放 整体实现 UITableView作为容器 每一个Item都是一个视频 卡片高
  • webpack打包微信小程序

    webpack打包微信小程序目的 编写小程序代码时也可以引入 npm 上的插件 通过 webpack 打包后可以大大减小小程序代码的体积 项目目录 项目目录 plugin loadpath js src 把小程序的代码放到 src 文件夹内
  • 华为交换机常用的查询命令(自己学习时统计的)

    display 简写dis dis logbuffer 查询交换机日志 dis arp include 10 0 0 1 查询该网段已使用的ip dis arp include 0 0 1 查询该端口下的ip dis clock 查询时间
  • 【Spring】Spring 报错 AbstractMethodError hikari MicrometerMetricsTrackerFactory create

    1 概述 windows下运行一个Spring boot程序报错 如下 org springframework beans factory BeanCreationException Error creating bean with nam
  • vue从node服务器获取文件,用vue上传文件并接收它nodejs

    我想用vuejs上传一个文件到服务器 实际上我不想用表单来处理文件并上传它 我阻止自己提交和处理一些逻辑 所以在开始我想要做一些简单的只是检查它是否是一个PDF格式 如果一切正常 应该指向我的服务器端进行的NodeJS服务器用vue上传文件
  • 熟悉html css,编写HTML和CSS的前端开发中不一定熟悉JavaScript

    原标题 编写HTML和CSS的前端开发中不一定熟悉JavaScript 作为前端开发人员 HTML css Java是必备的知识技能 但是现实工作工作中并非所有的前端都知道Java 根据外国一个网站的匿名调查发现 有17 的开发人员不知道J
  • 2022年中国研究生数学建模竞赛E题-草原放牧策略研究

    一 背景介绍 草原作为世界上分布最广的重要的陆地植被类型之一 分布面积广泛 中国的草原面积为3 55亿公顷 是世界草原总面积的6 8 居世界第二 此外 草原在维护生物多样性 涵养水土 净化空气 固碳 调节水土流失和沙尘暴等方面具有重要的生态
  • react中封装websocket

    websocket js中 import e from express websocket的四个回调函数 onopen onmessage onerror onclose import websocket from Websocket im
  • [现代控制理论]11_现代控制理论串讲_完结_pdf获取

    DR CAN的现代控制理论的笔记就结束了 加上这篇一共11篇 现代控制理论 11 现代控制理论串讲 完结 pdf获取 现代控制理论 10 可观测性与分离原理 观测器与控制器 现代控制理论 9 状态观测器设计 龙伯格观测器 现代控制理论 8
  • Echarts图导出到excel(excel导入图片)

    参照博文echart图导出到pdf 将前台传到后台的二十四位字节编码生成图片 然后将图片导出到excel中 public static void exportEchartsImg HttpServletResponse response L
  • 用云渲染好还是自己搭建传统渲染农场好?

    今天云渲染小编就和大家说说云渲染以及它和传统渲染农场的区别 以及用云渲染好还是自己搭建传统渲染农场好 一 什么是云渲染 云渲染什么意思 首先云渲染是一种依托于云计算的云端服务 用户将本地文件提交到云端服务器 云端计算机集群完成渲染 再将渲染
  • WinForm教程(一)App.config等配置文件

    最近又回到用WinForm开发项目 难免少不了跟数据库打交道 平时也会在App config中写连接字串 但没有仔细深究过 当然除了写数据库字串 肯定还能写别的 我们无论在控制台程序还是窗体程序 都会遇见他 乘代码敲累之际 写篇博客平缓下
  • IFRAME 元素语法

    IFRAME 元素语法 创建内嵌浮动框架 成员表 下面的表格列出了 iframe 对象引出的成员 请单击左侧的标签来选择你想要查看的成员类型 标签属性 属性 描述 ALIGN align 设置或获取表格排列 ALLOWTRANSPARENC
  • linux下使用glob()实现打开任意目录下的所有文件

    linux下使用glob 实现打开任意目录下的所有文件 使用递归 参考了linux glob函数详解的实例4 编程思路 第一次调用glob获取当前目录下所有非隐藏文件 若此次目录文件下没有非隐藏文件 但却可能只有隐藏文件 接着第二次调用gl