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

题目要求:

对【程序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.mzph.cn/pingmian/30054.shtml

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

相关文章

解决 Visual C++ 17.5 __cplusplus 始终为 199711L 的问题

目录 软件环境问题描述查阅资料解决问题参考文献 软件环境 Visual Studio 2022, Visual C, Version 17.5.4 问题描述 在应用 https://github.com/ToniLipponen/cpp-sqlite 的过程中&#xff0c;发现源代码文件 sqlite.hpp 中&#xff0c;有一处宏&#xff0c;和本项目的 C L…

2024香港人才引进计划有哪些?申请条件、政策、利弊一次性说清楚

2024香港人才引进计划有哪些&#xff1f; 拥有香港身份&#xff0c;不仅可以享受到优质的教育资源、税收优惠、以及国际化的商业环境&#xff0c;还能在金融、商业、法律保障和生活品质等方面获得显著的好处。 而这&#xff0c;也是很多内地精英人群&#xff0c;通过申请香港…

哪个城市的Delphier最多?Delphier平均年龄多大了?

先来看看哪个城市的Delphier最多&#xff1a; 北上广深不是白叫的&#xff0c; 大家想换工作&#xff0c;就去这些大城市&#xff0c;机会多。 有人会觉得奇怪&#xff0c;怎么才这么几个人&#xff1f; 因为以上数据统计基数为2000人&#xff0c; 根据微信公众号和QQ群得出…

Linux1(介绍与基本命令1)

目录 一、初始Linux 1. Linux的起源 2. Linux是什么&#xff1f; 3. Linux内核版本 4. Linux的应用 5. 终端 6. Shell 7. Linux目录结构 二、基本命令 1. 基本的命令格式 2. shutdown 关机命令 3. pwd 当前工作目录 4. ls 查看目录内容 5. cd 改变工作目录 …

国际荐酒师携手各国际荐酒师专业委员会深化2024年度合作

国际荐酒师&#xff08;香港&#xff09;协会携手广东海上丝绸之路文化促进会及广东省城镇化发展研究会&#xff0c;深化2024年度合作&#xff0c;共同打造品荐与传播大师班培养荐酒师专业人材 近日&#xff0c;国际荐酒师&#xff08;香港&#xff09;协会、广东海上丝绸之路…

学会python——制作一款天气查询工具(python实例七)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、天气查询工具 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…

打造精致UI界面:字体设计的妙招

字体设计是UI设计的关键模块之一。字体设计是否有效可能直接实现或破坏整个UI界面。那么&#xff0c;界面设计的字体设计有哪些规范呢&#xff1f;如何设计细节字体&#xff1f;本文将解释字体设计规范的可读性、可读性和可用性&#xff0c;并介绍UI界面中的字体设计技巧。 如…

【Python】JSON

json 一、JSON1.1 概述1.2 数据结构1.3 值1.4 字符串1.5 数值 二、编程语言与JSON2.1 JavaScript与JSON2.2 Python与JSON 一、JSON 1.1 概述 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写。同时也易于机器解析和生成。 JSON采…

如何用大模型+知识库打造微信群里的AI问答神器!

想象一下&#xff0c;你的微信群或公众号中&#xff0c;有一个AI问答专家随时待命&#xff0c;帮助你和你的朋友们解答各种问题&#xff0c;是不是很酷&#xff1f; 现在&#xff0c;让我们来看看这个项目的技术框架&#xff0c;一步步了解它是如何构建的&#xff1a; 基础起…

zookeeper学习、配置文件参数详解

zookeeper学习、配置文件参数详解 zookeeper 配置文件参数详解tickTime 、session 的过期时间、maxSessionTimeout 三者之间的关系initLimit&#xff0c;syncLimit什么区别minSessionTimeout 默认值,**他的单位是ms** zookeeper 配置文件参数详解 ZooKeeper 是一个分布式协调服…

自动驾驶#芯片-1

概述 汽车是芯片应用场景之一&#xff0c;汽车芯片需要具备车规级。  车规级芯片对加工工艺要求不高&#xff0c;但对质量要求高。需要经过的认证过程&#xff0c;包括质量管理标准ISO/TS 16949、可靠性标准 AEC-Q100、功能安全标准ISO26262等。  汽车内不同用途的芯片要求…

如何卸载windows系统自带游戏

为了清晰地指导如何卸载Windows系统自带游戏&#xff0c;我们可以参考以下步骤进行&#xff1a; 方法一&#xff1a;通过控制面板卸载 打开控制面板进入程序和功能在控制面板中&#xff0c;找到并点击“程序和功能”。在程序列表中&#xff0c;找到你想要卸载的自带游戏。 方…

AI一键生成PPT工具:AIPPT网站分享

PowerPoint演示文稿作为商业沟通、教育培训以及日常汇报的重要工具&#xff0c;一份精美的ppt可以帮助我们提升演示效果以及显示我们的专业性。为了提升ppt的制作效率&#xff0c;我们可以使用AI一键智能生成ppt工具&#xff0c;这样我们就可以快速制作出高大上的PPT了。下面小…

Web攻防:SQL注入 - MySQL 盲注

SQL注入 - MySQL 盲注 1. 基于布尔 SQL 盲注1.1 LEFT() 函数1.1.1 介绍&#xff1a;1.1.2 注入语法&#xff1a;1.1.3 案例 (SQLi-Labs&#xff1a;Less-8) 1.2 ASCII() 函数 SUBSTR() 函数1.2.1 介绍&#xff1a;1.2.2 注入语法&#xff1a;1.2.3 案例 (SQLi-Labs&#xff1a…

Java——可变参数

一、可变参数 1、介绍 Java的可变参数&#xff08;Varargs&#xff09;是一种语法特性&#xff0c;允许一个方法接受不定数量的参数。可变参数的使用通过在参数类型后面添加省略号&#xff08;...&#xff09;实现。这使得方法在调用时可以传入不同数量的参数&#xff0c;而不…

Android device/xxx/system/common/overlay编译产物

MTK 如下代码编译的产物在 framework-res.apk 编译配置文件在device/mediatek/system/common/目录下的Android.bp device/mediatek/system/common/overlay/telephony/frameworks/base/core/res/res/values-mcc655-mnc01/config.xml 在Android U上面还在overlay目录中进行了产…

python是TIOBE编程语言排名第一的编程语言,它有什么优点?它的使用场景有哪些?用python打印数字1--100,用python打印九九乘法表怎么写?

Python是TIOBE编程语言排行榜排名第一的编程语言 。 python是一种解释性、交互式、面向对象的跨平台的语言。 python设计者及名称由来 Guido van Rossum 荷兰人---吉多范罗苏姆&#xff0c;是 Python 编程语言的最初设计者&#xff0c;在 Python 社区一直担当终身仁慈独裁者&…

教你如何安装 IntelliJ IDEA

安装 IntelliJ IDEA 的步骤通常如下&#xff0c;这里提供的是基于 Windows 系统的安装指南。 下载 IntelliJ IDEA 1. 访问 JetBrains 官方网站&#xff1a;[https://www.jetbrains.com/idea/download/](Download IntelliJ IDEA – The Leading Java and Kotlin IDE) 2. 选择适…

vue+echarts实现tooltip轮播

效果图如下&#xff1a; 实现步骤如下&#xff1a; 定义一个定时器 timer:null, len: 0,页面一加载就清空定时器&#xff0c;此操作是为了防止重复加载时会设置多个定时器在setOption后设置定时器 this.myChart.clear() this.myChart.setOption(option); this.autoShowTool…

java 面试题--基础

文章目录 基础java SE 、 EE 、 ME 的区别jdk 和 jre 区别&#xff1f;java 的日志级别基本数据类型 特性关键字finalabstractsuperswitchfortry catch 接口和抽象类的区别接口抽象类适用场景 类的加载循序静态代码块 传参问题访问修饰符运算符 反射java 里的应用为什么反射的性…