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

news2024/11/25 0:37:04

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 目标文件目录图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搜索插入位置 ---- 二分查找

题目链接 题目: 分析: 因为数排序数组, 所以具有"二段性", 可以使用二分查找题目中, 我们如果找到目标值 , 则返回下标, 如果没找到目标值, 应该返回的是>target的第一个位置, 所以应该将数组分成< target 和 > target当<target时, 应该移动left, left…

Marin说PCB之POC电路layout设计仿真案例---03

今天中午午休我刚要打开手机的准备刷抖音看无忧传媒的学生们的“学习资料”的时候&#xff0c;看到CSDN -APP上有提醒&#xff0c;一看原来是一位道友发的一个问题&#xff1a; 本来小编最近由于刚刚从国外回来&#xff0c;手上的项目都已经结束了&#xff0c;这周开始学习仿真…

Xcode=> 安装 simulator

XCode xcode中下载 simulator 点击加号➕&#xff0c;选择对应的版本&#xff0c;即可下载 下载完成&#xff1a; 其他下载办法 因为使用上述下载&#xff0c;会经常性的出现断开&#xff0c;再次下载又是从头开始&#xff0c;太费时费力。下面使用下载地址&#xff0c;然后用…

软考中级-软件设计师-真题详解【2023年上半年】

2023上半年真题记忆点详解 本片不涉及解题法&#xff0c;只整理记忆背诵点&#xff0c;记住即可拿分。 上午题部分&#xff1a; 片内总线&#xff1a;用于芯片内部各主要部件连接&#xff1b; 系统总线&#xff1a;用于CPU、主存、外设见的数据传输&#xff1b; 通讯总线&…

百度信息流 - 成本保障未生效?

今天创建百度信息流单元时&#xff0c;发现一个细节&#xff0c;创建好后&#xff0c;成本保障未生效&#xff08;“保”字没有出现&#xff09; 过了一会&#xff0c;再进来看&#xff0c;成本保障生效了。 分析原因 &#xff1a; 展现为 1 &#xff0c;也就是说&#xff0c;一…

建筑施工突发事故应急处置vr安全培训平台

在不断发展的时代背景下&#xff0c;掌握必要的应急安全知识已成为我们生活中不可或缺的一部分。由央企携手我们华锐推出的3D线上应急宣教虚拟体验馆&#xff0c;标志着民众应急安全教育的全新里程碑&#xff0c;不仅突破了传统学习模式的局限&#xff0c;还让每个人都能在灵活…

GpuMall智算云:Ubuntu 实例桌面版

基于 ubuntu18.04 安装的桌面版本&#xff0c;桌面使用 xfce4 &#xff0c;集成了 Pytorch2.3.0、cuda11.8、Python3.10、VNC、noVNC、VSCode-Server。 在 镜像市场 选择xfce4-desktop镜像&#xff0c;然后进行创建实例 GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall…

这八个步骤,有效进行防错管理

导读 在产品实际的生产过程中&#xff0c;因零件相似而错装、因零件又小又多而漏装等现象时有发生&#xff0c;需要防止或尽可能避免错误发生。 试想&#xff0c;一个操作人员每天进行同样的装配工作上百次千次甚至上万次&#xff0c;如果产品设计和过程设计开发不能防止提前预…

vue.js状态管理和服务端渲染

状态管理 vuejs状态管理的几种方式 组件内管理状态&#xff1a;通过data&#xff0c;computed等属性管理组件内部状态 父子组件通信&#xff1a;通过props和自定义事件实现父子组件状态的通信和传递 事件总线eventBus&#xff1a;通过new Vue()实例&#xff0c;实现跨组件通…

Pytorch入门(7)—— 梯度累加(Gradient Accumulation)

1. 梯度累加 在训练大模型时&#xff0c;batch_size 最大值往往受限于显存容量上限&#xff0c;当模型非常大时&#xff0c;这个上限可能小到不可接受。梯度累加&#xff08;Gradient Accumulation&#xff09;是一个解决该问题的 trick梯度累加的思想很简单&#xff0c;就是时…

第12周作业--HLS入门

目录 一、HLS入门 二、HLS入门程序编程 创建项目 1、点击Vivado HLS 中的Create New Project 2、设置项目名 3、加入文件 4、仿真 3、综合 一、HLS入门 1. HLS是什么&#xff1f;与VHDL/Verilog编程技术有什么关系? HLS&#xff08;High-Level Synthesis&#xff0c…

自动化重置数据库功能的探索与实践

1、简介 在现代软件开发中&#xff0c;尤其是涉及到数据驱动的应用程序时&#xff0c;开发和测试环境中数据库的管理是至关重要的一环。为了确保开发和测试环境中的数据库始终处于一致的状态&#xff0c;自动化重置数据库成为了一种常见的实践。本文旨在介绍如何通过Shell脚本…

打印9*9乘法表(递归或压缩矩阵)python

打印9*9表def print_multiplication_table(row, col):if row > 10:return # 递归结束条件if col row:print() # 换行print_multiplication_table(row 1, 1) # 递归调用下一行else:print(f"{row-1} * {col} {(row-1) * col}\t", end"") # 打印乘法…

小程序properties默认值定义及父子组件的传值

因经常写vue&#xff0c;很久没写小程序&#xff0c;容易串频道&#xff0c;现记录一下小程序的组件用法、监听传入值及父子传值方式 首先小程序中传值是没有&#xff1a;(冒号)的&#xff0c;其次properties中定义默认值不需要写default 1.自定义组件中&#xff0c;首先json…

TransFormer学习之基础知识:STN、SENet、CBAM、Self-Attention

1.空间注意力机制STN 参考链接&#xff1a;STN(Spatial Transformer Networks) 参考链接&#xff1a;通俗易懂的Spatial Transformer Networks(STN) 核心动机&#xff1a; 在空间中捕获重要区域特征(如图像中的数字)&#xff0c;将核心区域进行放大居中&#xff0c;使得结果更…

2461. 长度为 K 子数组中的最大和(c++)

给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和&#xff1a; 子数组的长度是 k&#xff0c;且子数组中的所有元素 各不相同 。 返回满足题面要求的最大子数组和。如果不存在子数组满足这些条件&#xff0c;返回 0 。 子数…

第七节 ConfigurationClassParser 源码分析

tips&#xff1a; ConfigurationClassParser 是 Springframework 中的重要类。 本章主要是源码理解&#xff0c;有难度和深度&#xff0c;也枯燥乏味&#xff0c;可以根据实际情况选择阅读。 位置&#xff1a;org.springframework.context.annotation.ConfigurationClassPars…

怎样下载Android Studio历史版本文件包

1.在官网上下载都是推荐最新版本&#xff0c;想下载历史版本比较费劲&#xff0c;绕来绕去的。 2.进入这个网站可以下载其他版本https://android-studio.en.uptodown.com/windows/versions Older versions of Android Studio Its not uncommon for the latest version of an a…

【大数据】MapReduce实战

文章目录 [toc]Word CountMapperReducerrun.sh本地调试 基于白名单的Word CountMapperReducerrun.sh本地调试 文件分发-fileMapperReducerrun.sh -cacheFileMapperReducerrun.sh -cacheArchiveMapperReducerrun.sh 杀死MapReduce Job排序压缩文件mr_ip_lib_python本地调试 个人…

Flask Response 对象

文章目录 创建 Response 对象设置响应内容设置响应状态码设置响应头完整的示例拓展设置响应的 cookie重定向响应发送文件作为响应 总结 Flask 是一个 Python Web 框架&#xff0c;用于快速开发 Web 应用程序。在 Flask 中&#xff0c;我们使用 Response 对象来构建 HTTP 响应。…