【操作系统】操作系统实验04-文件系统扩展

news2025/1/18 21:11:19

题目要求:

对【程序5_9】进行扩展,要求参数为目录名,且其下至少有三层目录,分别用深度遍历及广度遍历两种方法对此目录进行遍历,输出此目录下所有文件的大小及修改时间。

1. 程序代码(注意程序格式)

1)深度优先遍历

1.#include <unistd.h> 
2.#include <stdio.h>
3.#include <stdlib.h> 
4.#include <errno.h> 
5.#include <sys/types.h> 
6.#include <sys/stat.h> 
7.#include <dirent.h> 
8.#include <time.h> 
9.#include <string.h>
10.#include <ctype.h>
11.
12.static int get_file_size_time(const char *filename){ 
13.	struct stat statbuf; 
14.	if(stat(filename,&statbuf) == -1){ //取 filename 的状态
15.		printf("Get stat on %s Error:%s\n", filename, strerror(errno)); 
16.		return(-1); 
17. 	} 
18.	if(S_ISDIR(statbuf.st_mode)){//判断是否是目录文件
19.		printf("%s:\n", filename);	
20.		return(1);
21.	}	 
22. 	if(S_ISREG(statbuf.st_mode)) //判断是否是普通文件
23.		printf("%s size: %ld bytes modifiedat: %s",filename,statbuf.st_size,ctime(&statbuf.st_mtime)); //输出文件的大小和最后修改时间
24.	return(0); 
25.}
26.
27.void circulation(char *argv){
28.	DIR *dirp; 
29.	if((dirp = opendir(argv)) == NULL){ //打开目录,将打开的目录信息放至 dirp 中,若为空,则打开失败
30.  		printf("Open Directory %s Error: %s\n", argv, strerror(errno)); 
31.		exit(1); 
32. 	}
33.	struct dirent *direntp; 
34.	char path[1024];
35.		
36.	while((direntp = readdir(dirp)) != NULL){
37. 		memset(path, 0, 1024);
38. 		strcpy(path, argv);
39. 		strcat(path, "/");
40. 		strcat(path, direntp -> d_name);
41. 		int ret = 0;
42. 		if(strcmp(direntp->d_name,".") != 0 && strcmp(direntp->d_name,"..") != 0){
43. 			ret = get_file_size_time(path);
44. 		}
45. 		if(ret == -1) //读取 dirp 目录下文件,直到出错或结束,退出
46. 			break;
47. 		if(ret == 1){
48. 			circulation(path);
49.		}
50.	}
51.	closedir(dirp);
52.} 
53.
54.int main(int argc,char **argv){ 
55.	int stats; 
56. 	if(argc != 2){ //判断输入是否为两个参数
57.  		printf("invalid input"); 
58.		exit(1); 
59.	} 
60. 	if(((stats = get_file_size_time(argv[1])) == 0) || (stats == -1))
61. 		exit(1); //若 argv[1]为文件(输出文件大小和最后修改时间)或者 stats 错误,都退出
62. 	
63.	circulation(argv[1]);//深度优先遍历 
64. 	 
65. 	exit(1); 
}

2)广度优先遍历

1.#include <unistd.h> 
2.#include <stdio.h>
3.#include <stdlib.h> 
4.#include <errno.h> 
5.#include <sys/types.h> 
6.#include <sys/stat.h> 
7.#include <dirent.h> 
8.#include <time.h> 
9.#include <string.h>
10.#include <ctype.h>
11.#include <queue>
12.#include <string>
13.#include <cstring>
14.
15.using namespace std;
16.
17.static int get_file_size_time(const char *filename){ 
18.	struct stat statbuf; 
19.	if(stat(filename,&statbuf) == -1){ //取 filename 的状态
20.		printf("Get stat on %s Error:%s\n", filename, strerror(errno)); 
21.		return(-1); 
22. 	} 
23.	if(S_ISDIR(statbuf.st_mode)){//判断是否是目录文件
24.		printf("%s:\n", filename);	
25.		return(1);
26.	}	 
27. 	if(S_ISREG(statbuf.st_mode)) //判断是否是普通文件
28.		printf("%s size: %ld bytes modifiedat: %s",filename,statbuf.st_size,ctime(&statbuf.st_mtime)); //输出文件的大小和最后修改时间
29.	return(0); 
30.}
31.
32.void circulation(char *argv){	
33.	struct dirent *direntp; 
34.	char path[1024];
35.	
36.	queue<string> q;
37.	q.push(argv);
38.	while(!q.empty()){
39.		string temp = q.front();
40.		q.pop();
41.		DIR *dirp; 
42.		if((dirp = opendir(temp.c_str())) == NULL){ //打开目录,将打开的目录信息放至 dirp 中,若为空,则打开失败
43.  			printf("Open Directory %s Error: %s\n", temp, strerror(errno)); 
44.			exit(1); 
45. 		}
46.		while((direntp = readdir(dirp)) != NULL){
47. 			memset(path, 0, 1024);
48. 			strcpy(path, temp.c_str());
49. 			strcat(path, "/");
50. 			strcat(path, direntp -> d_name);
51. 			int ret = 0;
52. 			if(strcmp(direntp->d_name,".") != 0 && strcmp(direntp->d_name,"..") != 0){
53. 				ret = get_file_size_time(path);
54. 			}
55. 			if(ret == -1) //读取 dirp 目录下文件,直到出错或结束,退出
56. 				break;
57. 			if(ret == 1){
58. 				q.push(path);
59.			}
60.		}
61.		closedir(dirp);		
62.	}	
63.} 
64.
65.int main(int argc,char **argv){ 
66.	int stats; 
67. 	if(argc != 2){ //判断输入是否为两个参数
68.  		printf("invalid input"); 
69.		exit(1); 
70.	} 
71. 	if(((stats = get_file_size_time(argv[1])) == 0) || (stats == -1))
72. 		exit(1); //若 argv[1]为文件(输出文件大小和最后修改时间)或者 stats 错误,都退出
73. 	
74.	circulation(argv[1]);//广度优先遍历 
75. 	 
76. 	exit(1); 
}

2. 运行结果截图

目录文件格式如图:

1)深度优先遍历

2)广度优先遍历

3. 总结

实现方法:

深度优先遍历:利用递归的思想,处理完当前节点后,判断此节点是否为目录节点(以此判断是否有子节点);若是,则先递归处理该节点,实现深度优先遍历;若不是,则不做处理。

广度优先遍历:利用队列存储当前目录下的子目录,当当前层遍历完后,从队列中取出头结点,对下一层文件进行遍历,以此规律实现广度优先遍历。

实验中遇到的问题与解决方法:

问题1:(深度优先遍历程序)运行程序,结果出现了无限循环的问题。

解决方法:最终发现是因为每个目录下默认有”.”与”..”的隐藏目录文件,因此递归时会无限递归本身以及上级目录。加入strcmp(direntp->d_name,".") != 0 && strcmp(direntp->d_name,"..") != 0判断条件得以解决问题。

问题2:(广度优先遍历程序)虽然加了<queue>头文件,程序编译过程中却出现如下报错:

解决方法:若要使用queue声明变量要引入std命名空间(using namespace std;)。

问题3:(广度优先遍历程序)程序编译过程中出现如下报错:

解决方法:原因是temp变量是string类型的,与函数需要的变量类型不一致。c_str()函数可以将const string*类型转化为const char*类型,将temp替换成temp.c_str()即可解决此问题。

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

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

相关文章

SYD88xx使代码在RAM内存中执行/运行

SYD88xx使代码在RAM中执行 SYD8811/8810默认都是cache模式的&#xff0c;但是在代码首次运行的时候&#xff0c;需要将代码从flash搬到cache中执行&#xff0c;这样第一次的代码执行可能会比较慢&#xff0c;这里提供一个将需要提速的代码放到RAM中执行的方法。 对于SYD8811…

【操作系统】操作系统实验03-页面置换算法

题目要求&#xff1a; 先读懂实验文档中的两个页面置换算法&#xff0c;参考文档中程序&#xff0c;实现以下要求&#xff1a; 假设某个进程P有6个页面&#xff0c;进程访问页的顺序自拟&#xff08;不少于20个&#xff09;&#xff0c;在内存中分配给该进程4个页面&#xff…

Blazor 中基于角色的授权

介绍 Blazor用于使用 .NET 代码库创建交互式客户端 Web UI。Microsoft 默认在 Blazor 应用程序中提供了一个用于身份验证和授权的身份框架。请注意&#xff0c;他们目前使用 MVC Core Razor 页面作为身份验证 UI。使用“Microsoft.AspNetCore.Identity.UI”包库来实现这一点。…

数据库大作业——音乐平台数据库管理系统

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; 《数据库系统》课程设计 &#xff1a;流行音乐管理平台数据库系统&#xff08;本数据库大作业使用软件sql server、dreamweaver、power designer&#xff09; 目录 系统需求设计 数据库概念结构设计 实体分析 属性分…

白酒:中国的酒文化的传承与发扬

中国&#xff0c;一个拥有五千年文明史的国度&#xff0c;其深厚的文化底蕴孕育出了丰富多彩的酒文化。在这片广袤的土地上&#xff0c;酒不仅仅是一种产品&#xff0c;更是一种情感的寄托&#xff0c;一种文化的传承。云仓酒庄的豪迈白酒&#xff0c;正是这一文化脉络中的一颗…

低代码专题 | 低代码开发平台怎么收费,价格多少?一文揭秘!

低代码开发平台近几年真的火得一塌糊涂&#xff0c;不少企业都开始关注并尝试这种新的开发方式。 然而&#xff0c;关于低代码开发平台的收费问题&#xff0c;却是众说纷纭、信息零散。为了帮助大家更清晰地了解低代码开发平台的收费情况&#xff0c;这篇文章将进行全面的解读…

leetcode498 对角线遍历

题目 给你一个大小为 m x n 的矩阵 mat &#xff0c;请以对角线遍历的顺序&#xff0c;用一个数组返回这个矩阵中的所有元素。 示例 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,4,7,5,3,6,8,9] 解析 本题目主要考察的就是模拟法&#xff0c;首…

【深度学习驱动流体力学】VTK创建、处理和可视化流体数据

Visualization Toolkit&#xff08;VTK&#xff09;是一个强大的开源软件系统&#xff0c;用于处理和可视化三维数据。它提供了丰富的工具和算法&#xff0c;可以处理从简单的网格数据到复杂的流体动力学模拟数据等各种类型的数据。本文将完整介绍如何使用 VTK 创建、处理和可视…

教育与学习助手:Kompas AI革新学习体验

一、引言 在个性化学习需求日益增长的今天&#xff0c;教育领域正经历着一场技术革命。Kompas AI&#xff0c;作为一款先进的人工智能助手&#xff0c;正以其独特的功能和应用&#xff0c;为学习者提供个性化的学习支持&#xff0c;满足不同背景和需求的学生。 二、功能介绍 Ko…

通过编辑器工具改变Inspector锁定状态

是在看一系列视频的时候&#xff0c;看到的&#xff0c;感觉挺有用&#xff0c;就记录下来。 就是这个小锁的按钮&#xff0c;后续可以通过快捷键&#xff0c;快速锁定和解锁。代码里没有加入快捷键控制&#xff0c;有需要用到的可以自己加一下&#xff0c;比较简单 using Uni…

大模型学习路线,存下吧很难找全的

随着人工智能技术的飞速发展&#xff0c;大模型在自然语言处理、计算机视觉、推荐系统等领域取得了显著成果。越来越多的学者和开发者开始关注并投身于大模型的研究与应用。本文将以大模型学习路线为核心&#xff0c;为您介绍从入门到精通所需掌握的知识和技能。 一、入门篇 …

简单好用的C++日志库spdlog使用示例

文章目录 前言一、spdlog的日志风格fmt风格printf风格 二、日志格式pattern三、sink&#xff0c;多端写入四、异步写入五、注意事项六、自己封装了的代码usespdlog.h封装代码解释使用示例 前言 C日志库有很多&#xff0c;glog&#xff0c;log4cpp&#xff0c;easylogging, eas…

[Java基础揉碎]QQ聊天项目

多用户系统演示 项目开发流程 多用户通讯需求 通讯系统整体分析 用户登录 新建项目 在建一个项目 user类 加上序列化, 加上UID增加兼容性 message类 消息类型 新建一个接口 客户端也拷贝过来 新建包和菜单界面类 工具类 新建一个类 新建一个类 回到这个类 写成这个名…

【论文精读】树环水印Tree-Ring Watermarks:隐形且稳健的扩散图像的指纹

文章目录 一、文章概览&#xff08;一&#xff09;主要工作&#xff08;二&#xff09;相关工作 二、具体方法&#xff08;一&#xff09;威胁模型&#xff08;二&#xff09;树轮水印概述&#xff08;三&#xff09;构造树轮水印键&#xff08;四&#xff09;提取用于水印检测…

【unity笔记】四、Enviro- Sky and Weather插件使用

一、 简介 Enviro内置 RP、URP、HDRP&#xff0c;开箱即用。 动态天空 随附的天空系统经过精心设计&#xff0c;以实现最佳性能和灵活性。使用多种颜色渐变&#xff0c;而不是调整人工数字。为您的项目创建独特且非常逼真的天空非常简单&#xff01; 灯光 由 Enviro 控制的逼…

APMCM亚太地区大学生数学建模竞赛奖励细则

APMCM亚太地区大学生数学建模竞赛&#xff08;以下简称竞赛&#xff09;是由北京图象图形学学会、亚太地区大学生数学建模竞赛组委会主办的面向全日制普通高等院校在校学生的学科竞赛活动。根据竞赛的宗旨&#xff0c;为了切实提供有价值的奖励政策&#xff0c;鼓励广大师生参与…

6.深度卷积神经网络

目录 1.深度卷积神经网络ALexNet 2012AlexNetAlexNet架构AlexNet与LeNet复杂度对比总结代码实现2.使用块的网络VGG 2014 image竞猜第二VGG架构进度总结代码实现3.网络中的网络NiN全连接层的问题NiN块NiN架构总结代码实现4.含并行连结的网络(GoogLeNet)2014 image竞猜第一最好…

制作ubuntu18.04 cuda10.2+ROS1+opencv 4.5.4的 docker镜像

如果搭建的版本高可以参考&#xff1a; https://gitlab.com/nvidia/container-images/l4t-jetpack.git 如果版本比较低&#xff0c;按照下面的步骤进行操作&#xff1a; 使用的硬件平台为Xavier NX&#xff0c;系统环境如下图&#xff1a; 搭建docker环境需求跟实际环境一致如下…

逻辑地址 线性地址 物理地址 Linux kernel 内存管理设计

linux kernel 2.6以后的MM&#xff0c;受到了兼容 risc arch cpu 的 MM 的启发&#xff0c;新的 MM 架构对 x86 上任务切换的效率上也有明显提高。 新的MM架构&#xff0c;GDT 不再随着进程的创建与结束而创建和删除 新的表项。 TSS段 也只有一个&#xff0c;进程切换时&…

手持风扇哪个品牌好?五大手持风扇品牌推荐!

随着炎热夏季的到来&#xff0c;手持风扇已成为人们出行的必备清凉神器。然而&#xff0c;面对市场上众多品牌的手持风扇&#xff0c;如何选择一款既时尚又高效的产品成为了许多消费者的难题。为了解决这个困扰&#xff0c;我们精心挑选了五大手持风扇品牌进行推荐。这些品牌不…