当前位置: 首页 > web >正文

Linux文件目录操作实战

文章目录

    • ✅ 功能要求拆解:
      • ① **统计当前目录的内存使用率**
      • ② **统计当前目录及子目录下的所有文件**
    • ✅ 完整的 `main.c`
    • ✅ 编译方式
    • ✅ 输出示例
    • ✅ 说明与扩展


本篇文章主要带大家实现两个功能:

1.统计目录内存占用率

2.统计当前目录文件数量及进行文件先后顺序的排序

下面是在 Linux 下使用 C语言 实现的 main.c,实现两个功能:


✅ 功能要求拆解:

统计当前目录的内存使用率

  • 使用 statvfs() 获取当前目录所在挂载点的空间使用情况(总空间 / 可用空间)。

统计当前目录及子目录下的所有文件

  • 使用 nftw()(递归遍历目录);
  • 记录每个文件路径和其最后修改时间;
  • 最后按时间升序打印出来。

✅ 完整的 main.c

#define _XOPEN_SOURCE 500
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ftw.h>
#include <sys/statvfs.h>
#include <sys/stat.h>
#include <time.h>#define MAX_FILES 10000// 用于存储文件信息
typedef struct {char path[1024];time_t mtime;
} FileInfo;FileInfo files[MAX_FILES];
int file_count = 0;// nftw 回调函数,收集普通文件信息
int collect_file(const char* fpath, const struct stat* sb, int typeflag, struct FTW* ftwbuf) {if (typeflag == FTW_F && file_count < MAX_FILES) {strncpy(files[file_count].path, fpath, sizeof(files[file_count].path) - 1);files[file_count].mtime = sb->st_mtime;file_count++;}return 0;
}// 比较函数:按修改时间升序排序
int compare_files(const void* a, const void* b) {return ((FileInfo*)a)->mtime - ((FileInfo*)b)->mtime;
}// 功能一:打印当前目录所在挂载路径的使用率
void print_disk_usage() {struct statvfs fs;if (statvfs(".", &fs) != 0) {perror("statvfs failed");return;}unsigned long total = fs.f_blocks * fs.f_frsize;unsigned long free = fs.f_bfree * fs.f_frsize;unsigned long used = total - free;double usage = (double)used / total * 100.0;printf(">>> 当前目录所在挂载点磁盘使用率: %.2f%%\n", usage);
}// 功能二:遍历当前目录及子目录,统计并按时间打印所有文件
void scan_and_print_files() {printf("\n>>> 扫描当前目录及子目录中的文件...\n");// 遍历目录if (nftw(".", collect_file, 20, FTW_PHYS) == -1) {perror("nftw failed");return;}// 按时间排序qsort(files, file_count, sizeof(FileInfo), compare_files);// 打印结果for (int i = 0; i < file_count; ++i) {char buf[64];struct tm* t = localtime(&files[i].mtime);strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", t);printf("[%s] %s\n", buf, files[i].path);}
}int main() {print_disk_usage();scan_and_print_files();return 0;
}

✅ 编译方式

创建一个简单的 Makefile

all:gcc main.c -o file_stat -lnftw

或者命令行手动编译:

gcc main.c -o file_stat -lnftw

然后运行程序:

./file_stat

✅ 输出示例

>>> 当前目录所在挂载点磁盘使用率: 23.45%>>> 扫描当前目录及子目录中的文件...
[2025-04-26 09:12:00] ./test.txt
[2025-04-26 09:14:32] ./src/demo.c
[2025-04-26 09:15:10] ./README.md

在这里插入图片描述

✅ 说明与扩展

  • statvfs():用于获取文件系统信息(磁盘容量和使用率);
  • nftw():递归遍历当前目录和所有子目录;
  • qsort():排序所有文件的修改时间;
  • 可以扩展打印文件大小、类型,或过滤某类文件(如 .c)。
http://www.xdnf.cn/news/2197.html

相关文章:

  • 【C++】15. 模板进阶
  • 【含文档+PPT+源码】基于Python的美食数据的设计与实现
  • llama factory 命令行推理流程
  • MUC基本知识
  • 电子电器架构 --- 乘用车电气/电子架构开发的关键挑战与应对策略
  • Shell编程之正则表达式
  • c++弹窗
  • threejs 零基础学习day01
  • 【补题】Codeforces Global Round 20 F1. Array Shuffling
  • Python循环中断:break和continue,循环else语法,综合案例
  • 一、人类社会结构的根本逻辑
  • Cribl 上传lookup 表,传入数据进event
  • 计算机网络的五层结构(物理层、数据链路层、网络层、传输层、应用层)到底是什么?
  • 揭开人工智能的神秘面纱:从概念到人工神经网络
  • Spring和Spring Boot集成MyBatis的完整对比示例,包含从项目创建到测试的全流程代码
  • 数据库系统概论(四)关系操作,关系完整性与关系代数
  • springboot集成MyBatis Generator快速开发
  • Pygame跨平台打包:将游戏发布到Windows、Mac和Linux
  • 当JIT遇见K8s
  • 如何下载VSCode插件市场为VSIX文件
  • 在Mybatis中为什么要同时指定扫描mapper接口和 mapper.xml 文件,理论单独扫描 xml 文件就可以啊
  • Maven进阶知识
  • 【TypeScript】速通篇
  • 打破云墙:多云环境中的DevOps实践指南
  • 5.3/Q1,GBD数据库最新文章解读
  • 【Java面试笔记:进阶】22.AtomicInteger底层实现原理是什么?如何在自己的产品代码中应用CAS操作?
  • QQMusic项目功能总结
  • openEuler对比CentOS的核心优势分析
  • Web端ER可视化
  • 部署大模型需要多少GPU显存?以DeepSeek R1部署为例