Linux程序开发(十):文件分类器趣味设计

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊!

喜欢我的博客的话,记得点个红心❤️和小关小注哦!您的支持是我创作的动力!数据源存放在我的资源下载区啦!

Linux程序开发(十):文件分类器趣味设计

目录

  • Linux程序开发(十):文件分类器趣味设计
    • 题目:文件分类器
    • 题目描述:
    • 示例输入:
    • 示例输出:
    • 提示:
    • 解答
    • 截图:

题目:文件分类器

题目描述:

小明是一个喜欢整理文件的人,他希望编写一个程序来帮助他自动将指定文件夹中的文件按照类型进行分类。具体来说,他想将图片文件(以.jpg或.png结尾)、音频文件(以.mp3或.wav结尾)和文本文件(以.txt结尾)分别移动到对应的类别文件夹中。
请你编写一个C程序,实现小明的需求。程序需要满足以下要求:
1、将源文件夹中的文件按照类型分类,并移动到对应的目标文件夹中。
2、源文件夹和目标文件夹的路径由程序输入时提供,可以相对路径或绝对路径。
3、程序需要递归地处理子文件夹中的文件。
4、如果目标文件夹不存在,则需要创建它。
5、移动文件时,需要保留原文件的权限和时间戳。

示例输入:

源文件夹路径:/root/homework/qm_1/Documents
目标文件夹路径:/root/homework/qm_1/SortedFiles

示例输出:

文件分类完成!

提示:

可以使用Linux系统函数opendir()、readdir()、closedir()来遍历源文件夹中的文件和子文件夹。
可以使用Linux系统函数stat()获取文件的信息,包括文件类型和权限等。
可以使用Linux系统函数mkdir()创建目标文件夹。
可以使用Linux系统函数rename()移动文件。

解答

# docu_sort.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#define MAX_PATH_SIZE 1024
// 判断路径是否是目录
int is_directory(const char *path) {
    struct stat path_stat;
    stat(path, &path_stat);
    return S_ISDIR(path_stat.st_mode);
}
// 创建目录
int create_directory(const char *path) {
    if (mkdir(path, 0777) == -1) {
        return -1;
    }
    return 0;
}
// 移动文件
void move_file(const char *src_path, const char *dst_path) {
    if (rename(src_path, dst_path) == -1) {
        printf("Failed to move %s\n", src_path);
    }
}
// 对文件进行分类
void sort_files(const char *src_dir, const char *dst_dir) {
    DIR *dir;
    struct dirent *ent;
    char file_path[MAX_PATH_SIZE];
    char dst_path[MAX_PATH_SIZE];

    // 打开源文件夹
    if ((dir = opendir(src_dir)) != NULL) {
        // 遍历源文件夹中的每个文件
        while ((ent = readdir(dir)) != NULL) {
            // 忽略 "." 和 ".."
            if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0) {
                continue;
            }
            // 构造文件的完整路径
            snprintf(file_path, sizeof(file_path), "%s/%s", src_dir, ent->d_name);
            // 判断文件是否是目录
            if (is_directory(file_path)) {
                // 如果是目录,则递归处理子目录
                char new_src_dir[MAX_PATH_SIZE];
                char new_dst_dir[MAX_PATH_SIZE];
                strcpy(new_src_dir, src_dir);
                strcat(new_src_dir, "/");
                strcat(new_src_dir, ent->d_name);
                strcpy(new_dst_dir, dst_dir);
                strcat(new_dst_dir, "/");
                strcat(new_dst_dir, ent->d_name);
                create_directory(new_dst_dir);
                sort_files(new_src_dir, new_dst_dir);
            } else {
                // 根据文件扩展名确定目标路径
                char *extension = strrchr(ent->d_name, '.');
                if (extension == NULL) {
                    strcpy(dst_path, dst_dir);
                    strcat(dst_path, "/unknown/");
                } else if (strcmp(extension, ".txt") == 0) {
                    strcpy(dst_path, dst_dir);
                    strcat(dst_path, "/text/");
                } else if (strcmp(extension, ".mp3") == 0 || strcmp(extension, ".wav") == 0) {
                    strcpy(dst_path, dst_dir);
                    strcat(dst_path, "/audio/");
                } else if (strcmp(extension, ".jpg") == 0 || strcmp(extension, ".png") == 0) {
                    strcpy(dst_path, dst_dir);
                    strcat(dst_path, "/image/");
                } else {
                    strcpy(dst_path, dst_dir);
                    strcat(dst_path, "/unknown/");
                }
                // 创建目标目录(如果不存在)
                create_directory(dst_path);
                // 构造目标文件的完整路径
                strcat(dst_path, ent->d_name);

                // 移动文件到目标路径
                move_file(file_path, dst_path);
            }
        }
        closedir(dir);  // 关闭源文件夹
    } else {
        printf("Failed to open directory %s\n", src_dir);
    }
}
int main() {
    char src_dir[MAX_PATH_SIZE];
    char dst_dir[MAX_PATH_SIZE];
    printf("请输入源文件夹路径:");
    fgets(src_dir, sizeof(src_dir), stdin);
    src_dir[strcspn(src_dir, "\n")] = '\0';  // 去掉末尾的换行符

    printf("请输入目标文件夹路径:");
    fgets(dst_dir, sizeof(dst_dir), stdin);
    dst_dir[strcspn(dst_dir, "\n")] = '\0';  // 去掉末尾的换行符

    // 自动创建目标文件夹
    create_directory(dst_dir);

    // 对文件进行分类
    sort_files(src_dir, dst_dir);

    printf("文件分类完成!\n");

    return 0;
}

截图:

在这里插入图片描述
图 1.1 源文件目录图
在这里插入图片描述
图 1.2 编译运行程序图
在这里插入图片描述
图 1.3 目标文件目录图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/639393.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Win10蓝牙鼠标不能移动问题解决

问题描述&#xff1a;鼠标是没损坏的&#xff0c;使用过程中&#xff0c;光标突然就不能移动了&#xff0c;但右键和滚轮还是有反应。 解决&#xff1a; 1&#xff0c;删除蓝牙设置中的如下配置&#xff08;我只使用了无线鼠标&#xff0c;没有无线键盘&#xff09; 2&#x…

智慧校园为高校带来哪些价值

在21世纪的教育图景中&#xff0c;"智慧"不再仅仅是一个科技名词&#xff0c;它已成为衡量教育现代化水平的重要标志。智慧校园&#xff0c;这一融合了物联网、大数据、云计算等先进技术的教育新形态&#xff0c;正逐步成为高校转型升级的关键驱动力。本文将从多个维…

【题解】AB33 相差不超过k的最多数(排序 + 滑动窗口)

https://www.nowcoder.com/practice/562630ca90ac40ce89443c91060574c6?tpId308&tqId40490&ru/exam/oj 排序 滑动窗口 #include <iostream> #include <vector> #include <algorithm> using namespace std;int main() {int n, k;cin >> n &…

【Java】/*类和对象(下)*/

目录 一、封装 1.1 初识封装 1.2 如何封装成员变量 1.3 如何使用封装后的成员变量 二、访问限定符 三、包 3.1 包的概念 3.2 如何自定义包 3.3 导入包中的类 3.4 包的访问权限控制举例 示例一&#xff1a;private修饰成员变量 示例二&#xff1a; 不去修饰成员变…

有容量限制的车辆路径规划问题(Capacitated Vehicle Routing Problem)

在看matlab的时候发现了这篇文章https://www.frontiersin.org/articles/10.3389/fict.2019.00013/full 仔细阅读一下。(英语渣渣&#xff0c;自学用) The Capacitated Vehicle Routing Problem (CVRP) is an NP-optimization problem (NPO) that has been of great interest …

秋招突击——算法打卡——5/24——无重复字符的最长字串

题目描述 实现代码 // 无重复字符的最长子串 int lengthOfLongestSubstring(string s) {int l 0,r 0;int res 0;unordered_map<char,int> temp;while(l < s.size()){temp[s.at(l)] l;for (r l 1; r < s.size() ; r) {if(temp.count(s.at(r))) break;else te…

CTF网鼎杯2020朱雀组 thinkjava思路记录

1.代码分析 BUUCTF在线评测 (buuoj.cn)打开ctf赛题之后&#xff0c;下载class文件&#xff0c;这个部分是不完整点的源码 在sqldict中存在一个sql注入点&#xff0c;没有采用java的预编译&#xff0c;调用了这个的是在test中&#xff0c;同时&#xff0c;这个采用了swagger接口…

基于 Faster-RCNN 的水稻叶片病害检测方法研究

1 前言 本次分享是使用基于 Faster-RCNN 的水稻叶片病害检测的深度学习算法研究&#xff0c;也是我研究的课题&#xff0c;本文本文使用的算法架构为 Faster R-CNN&#xff0c;研究的课题为使用两种不同的主干特征提取网ResNet-50 和VGG-16 模型进行模型训练和对比评估那…

windows ssh客户端mobaxterm密码登录到debian12 openssh服务器

1&#xff0c;在debian12生成公钥、秘钥 ssh-keygen -t rsa ~/.ssh/id_rsa 是秘钥&#xff0c;要放到windows的&#xff08;这里先不要放&#xff0c;等转换一下再放&#xff09;&#xff1b; ~/.ssh/id_rsa.pub 是公钥&#xff0c;放在debian12本地就好了&#xff0c; 顺…

HCIA第二天复习上

延长传输距离-------中继器&#xff08;放大器&#xff09;------物理层设备 可以延长5倍传输距离 增加网络节点数量 网络拓扑结构 1直线型拓扑 信息安全性差 网络延迟高传输速度慢 2环形拓扑 3星型拓扑 4网状型拓扑 传输效率高&#xff0c;…

MySQL主从复制(docker搭建)

文章目录 1.MySQL主从复制配置1.主服务器配置1.拉取mysql5.7的镜像2.启动一个主mysql&#xff0c;进行端口映射和目录挂载3.进入/mysql5.7/mysql-master/conf中创建my.cnf并写入主mysql配置1.进入目录2.执行命令写入配置 4.重启mysql容器&#xff0c;使配置生效5.进入主mysql&a…

cn.hutool.poi.excel 实现excel导出效果 首行高度,行样式,颜色,合并单元格,例子样式

需求 接了需求&#xff0c;下载excel模版&#xff0c;本来看着还是简单的&#xff0c;然后实现起来一把泪&#xff0c;首先是使用poi&#xff0c;我查了好久&#xff0c;才实现&#xff0c;然后是我用easyexcel又实现了一遍&#xff0c;用了一个周多才实现。 这是需求&#x…

docker实战之搭建MYSQL8.0主从同步

目录 环境配置容器创建主服务器创建MYSQL容器新增my.cnf文件创建用户并授权 从服务器创建MYSQL容器新增my.cnf文件重启MYSQL容器配置主从同步 验证主从同步彩蛋 MySQL 主从同步&#xff08;Master-Slave Replication&#xff09;是一种常用的解决方案&#xff0c;它允许一个主服…

【Redis7】Redis持久化机制之RDB

文章目录 1.RDB简介2.RDB配置触发设置3.RDB的优缺点4.如何检查修复RDB文件5.如何禁用RDB6.RDB参数优化7.总结 1.RDB简介 Redis持久化机制中的RDB&#xff08;Redis Database&#xff09;是一种将Redis在某个时间点的数据以快照形式保存到磁盘上的方法。 原理&#xff1a;RDB通…

python:pycharm虚拟解释器报错环境位置目录为空

目录 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; pycharm解释器 解释器分控制台解释器 和 pycharm解释器 控制台解释器切换&#xff1a; 切换到解释器下 激活解释器 查看解释器 where python 激活成功 这时在控制台使用python xxx.py 可以…

java面试框架篇(Spring常见问题、SpringBoot、SpringMVC、mybatis经典问题、SpringCloud组件)

文章目录 面试专题-java框架篇1. spring常见问题1.1. spring是什么?1.2. 谈谈你对AOP的理解1.3. 谈谈你对IOC的理解1.4. Spring Boot、 Spring MVC和Spring有什么区别1.5. spring bean 生命周期1.6. spring事务传播机制有哪些?1.7. 循环依赖1.8. spring框架中使用了哪些设计模…

在链游中,智能合约如何被用于实现游戏内的各种功能

随着区块链技术的快速发展&#xff0c;链游&#xff08;Blockchain Games&#xff09;作为区块链技术的重要应用领域之一&#xff0c;正逐渐展现出其独特的魅力和优势。其中&#xff0c;智能合约作为链游的核心技术之一&#xff0c;对于实现游戏内的各种功能起到了至关重要的作…

k8s的网路配置

目录 1、k8s相关网络类型 1.1 K8S中Pod网络通信 1.2 Overlay Network 1.3 VXLAN 1.3.1 vlan和vxlan的区别 2、Flannel 2.1 简介 2.2 Flannel工作原理 2.3 ETCD之Flannel提供说明 2.4 Flannel部署 2.4.1 在node节点上操作 2.4.2 在master01节点上操作 2.4.2.1 安装f…

LangChain llamaindex

LangChain 参考&#xff1a; 全流程 | Windows 系统本地部署开源模型阿里通义千问 QWEN 1.5&#xff0c;结合 LangChain-Chatchat 框架和向量数据库 FAISS、Milvus - 知乎

MySQL 插入数据的时候自动忽略重复数据

MySQL中插入数据&#xff0c;如果插入的数据在表中已经存在&#xff08;主键或者唯一键已存在&#xff09;&#xff0c;使用insert into语法的时候&#xff0c;如果遇到重复数据&#xff0c;会直接报错&#xff0c;导致事务回滚&#xff0c;所有插入数据&#xff0c;全部失败。…