嵌入式学习第十八天(目录IO)

news2024/10/5 4:38:19

目录IO:

1. mkdir

int mkdir(const char *pathname, mode_t mode);

    功能:创建目录文件

    参数:

        pathname:文件路径

        mode:文件的权限

                rwx rwx rwx

                111 111 111

               0  7   7     7

                r:目录中是否能够查看文件

                w:目录中是否能够新建文件

                x:目录是否能够进入

    返回值:

        成功返回0

        失败返回-1

2. rmdir:

int rmdir(const char *pathname);

    功能:删除空目录文件

    返回值:

        成功返回0 

        失败返回-1

3. opendir

DIR *opendir(const char *name);

    功能:打开目录获得目录流指针

    参数:

        name:目录文件路径

    返回值:

        成功返回目录流指针

        失败返回NULL

4. closedir

int closedir(DIR *dirp);

    功能:关闭目录流指针

5. readdir

struct dirent *readdir(DIR *dirp);

    功能:从目录流中读取下一个目录项的结构体信息

    参数:

        dirp:目录流指针

    返回值:

        成功返回包含目录项信息的空间首地址
        失败返回NULL
        读到文件末尾返回NULL

struct dirent {
            ino_t          d_ino;       /* Inode number */
            off_t          d_off;       /* Not an offset; see below */
            unsigned short d_reclen;    /* Length of this record */
            unsigned char  d_type;      /* Type of file; not supported
                                            by all filesystem types */
            char           d_name[256]; /* Null-terminated filename */
        };

6. chdir

int chdir(const char *path);

    功能:切换当前代码的工作路径

7. getcwd

char *getcwd(char *buf, size_t size);

    功能:获得当前目录的绝对路径

8. access

int access(const char *pathname, int mode);

    功能:检测调用函数的程序对文件是否拥有指定权限

    参数:

        pathname:文件路径

        mode:

            R_OK    检测是否拥有读权限
            W_OK    检测是否拥有写权限
            X_OK    检测是否拥有执行权限
            F_OK    检测文件是否存在

    返回值:

        有该权限返回0
        出错返回-1

作业:

        1. 执行两次代码,打印出两次执行过程中新增的文件及删除的文件

#include "head.h"

int ListFile(const char *pdirname, const char *pfilename)
{
	FILE *fp = NULL;
	DIR *dp = NULL;
	struct dirent *pp = NULL;
	char tmpbuff[4096] = {0};

	fp = fopen(pfilename, "a");
	if(fp == NULL)
	{
		perror("fail to fopen");
		return -1;
	}
	
	dp = opendir(pdirname);
	if(dp == NULL)
	{
		perror("fail to opendir");
		return -1;
	}

	while(1)
	{
		pp = readdir(dp);
		
		if(pp == NULL)
		{
			break;
		}

		if(*pp->d_name == '.')
		{
			continue;
		}

		sprintf(tmpbuff, "%s/%s", pdirname, pp->d_name);
		fprintf(fp, "%s\n", tmpbuff);

		if(pp->d_type == DT_DIR)
		{
			ListFile(tmpbuff, pfilename);
		}
	
	}

	fclose(fp);
	closedir(dp);
	
	return 0;
}

int ListDir(const char *pdirname, const char *pfilename)
{
	FILE *fsrc = NULL;
	FILE *fdst = NULL;
	DIR *dp = NULL;

	struct dirent *pp = NULL;
	char tmpbuff[4096] = {0};

	char tmpsrc[4096] = {0};
	char tmpdst[4096] = {0};
	char *psrc = NULL;
	char *pdst = NULL;

	fsrc = fopen(pfilename, "r");
	if(fsrc == NULL)
	{
		perror("fail to fopen");
		return -1;
	}

	fdst = fopen("b.txt", "w+");
	if(fdst == NULL)
	{
		perror("fail to fopen");
		return -1;
	}

	dp = opendir(pdirname);
	if(dp == NULL)
	{
		perror("fail to opendir");
		return -1;
	}

	ListFile(pdirname, "b.txt");
	
	fseek(fsrc, 0, SEEK_SET);
	fseek(fdst, 0, SEEK_SET);

	while(1)
	{
		pdst = fgets(tmpdst, sizeof(tmpdst), fdst);
		if(pdst == NULL)
		{
			break;
		}

		int found1 = 0;
		fseek(fsrc, 0, SEEK_SET);
		while(1)
		{
			psrc = fgets(tmpsrc, sizeof(tmpsrc), fsrc);
			if(psrc == NULL)
			{
				break;
			}
			
			if(strcmp(tmpsrc, tmpdst) == 0)
			{
				found1 = 1;
				break;
			}
		}
		if(!found1)
		{
			printf("add:%s\n", tmpdst);			
		}
		
	}

	fseek(fsrc, 0, SEEK_SET);
	fseek(fdst, 0, SEEK_SET);

	while(1)
	{
		psrc = fgets(tmpsrc, sizeof(tmpsrc), fsrc);
		if(psrc == NULL)
		{
			break;
		}

		int found2 = 0;
		fseek(fdst, 0, SEEK_SET);
		while(1)
		{
			pdst = fgets(tmpdst, sizeof(tmpdst), fdst);
			if(pdst == NULL)
			{
				break;
			}

			if(strcmp(tmpdst, tmpsrc) == 0)
			{
				found2 = 1;
				break;
			}
		}
		if(!found2)
		{
			printf("mul:%s\n", tmpsrc);
		}
	}

	fclose(fsrc);
	fclose(fdst);
	closedir(dp);
	
	return 0;
}

int main(int argc, const char *argv[])
{
	int flat = 0;

	if(argc != 3)
	{
		fprintf(stderr, "Usage:./a.out dirname filename\n");
		return -1;
	}

	flat = access(argv[2], F_OK);
	if(flat == 0)
	{
		ListDir(argv[1], argv[2]);
		
	}
	else
	{
		ListFile(argv[1], argv[2]);
	}

	return 0;
}

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

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

相关文章

瑞_23种设计模式_代理模式

文章目录 1 代理模式(Proxy Pattern)1.1 介绍1.2 概述1.3 代理模式的结构 2 静态代理2.1 介绍2.2 案例——静态代理2.3 代码实现 3 JDK动态代理★★★3.1 介绍3.2 代码实现3.3 解析代理类3.3.1 思考3.3.2 使用 Arthas 解析代理类3.3.3 结论 3.4 动态代理…

ARM体系在linux中的中断抢占

上一篇说到系统调用等异常通过向量el1_sync做处理,中断通过向量el1_irq做处理,然后gic的工作都是为中断处理服务,在rtos中,我们一般都会有中断嵌套和优先级反转的概念,但是在linux中,中断是否会被其他中断抢…

RTC时钟

目录 一、STM32F407内部RTC硬件框图,主要由五大部分组成: 二、硬件相关引脚 三、具体代码设置步骤 四、了解其它知识点 一、STM32F407内部RTC硬件框图,主要由五大部分组成: ① 时钟源 (1)LSE:一般我们选择 LSE&am…

网络编程_TCP通信综合练习:

1 //client:: public class Client {public static void main(String[] args) throws IOException {//多次发送数据//创建socket对象,填写服务器的ip以及端口Socket snew Socket("127.0.0.1",10000);//获取输出流OutputStream op s.getOutput…

python统计分析——一元线性回归分析

参考资料:用python动手学统计学 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 用于绘图的库 import matplotlib.pyplot as plt import seaborn as sns sns.set() # 用于估计统计…

【高效开发工具系列】PyCharm使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

vue3项目配置按需自动导入API组件unplugin-auto-import

场景应用:避免写一大堆的import,比如关于Vue和Vue Router的 1、安装unplugin-auto-import npm i -D unplugin-auto-import 2、配置vite.config import AutoImport from unplugin-auto-import/vite//按需自动加载API插件 AutoImport({ imports: ["…

Unity中的Lerp插值的使用

Unity中的Lerp插值使用 前言Lerp是什么如何使用Lerp 前言 平时在做项目中插值的使用避免不了,之前一直在插值中使用存在误区,在这里浅浅记录一下。之前看的博客或者教程还多都存在一个“永远到达不了,只能无限接近”的一个概念。可能是之前脑…

ThreadLocal “你”真的了解吗?

今天想梳理一个常见的面试题。在开始之前,让我们一起来回顾一下昨天的那篇文章——《Spring 事务原理总结七》。这篇文章比较啰嗦,层次也不太清晰,所以以后有机会我一定要重新整理一番。这篇文章主要想表达这样一个观点:Spring的嵌…

对于软件测试的理解

前言 “尽早的介入测试,遇到问题的解决成本就越低” 随着软件测试技术的发展,测试工作由原来单一的寻找缺陷逐渐发展成为预防缺陷,探索测试,破坏程序的过程,测试活动贯穿于整个软件生命周期中,故称为全程…

【SpringBoot】项目启动增加自定义Banner

SpringBoot项目启动增加自定义Banner 前言 最近有个老哥推荐我给博客启动的时候加上自定义Banner,开始我还不太明白他说的是那部分,后面给我发了这样一个,瞬间就懂了~ // _ooOoo_ …

Python(九十三)函数的参数总结

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

不要0!我们需要1!

解法一&#xff1a; 十进制转二进制同时数1的个数 #include<iostream> #define endl \n using namespace std; void solve(int x) {int cnt 0;while (x) {if (x % 2 1) cnt;x / 2;}cout << cnt << endl; } int main() {int n;cin >> n;solve(n);re…

2024-2-19 LC200. 岛屿数量

其实还是用并查集将 独立的岛屿视为独立的子集。 count其实是集合的个数&#xff0c;同一个块岛屿被压缩成了一个集合&#xff0c;而每个表示海洋的格子依然被看作独立的集合&#xff0c;在所有的格子都走完一遍后&#xff0c;count 被压缩的岛屿 所有表示海洋的独立格子的数…

2024.2.19

使用fread和fwrite完成两个文件的拷贝 #include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc, const char *argv[]) {FILE *fpNULL;if((fpfopen("./tset.txt","w"))NULL){perror("open error");retur…

免费白嫖一个互联网创业者交流论坛,真香!

先说最重要的 当前小报童39.9&#xff0c;2.23之后会涨价到99.9 现在扫码购买&#xff0c;然后凭借截图找我全款报销&#xff0c;全款报销&#xff01; 扫码报销&#xff0c;备注“烽狂创客” 下面来看下这个专栏的内容 专栏作者是谁 挽歌&#xff0c;20岁&#xff0c;985大…

1. 处理日期和时间的 chrono 库

1. 处理日期和时间的 chrono 库 C11 中提供了日期和时间相关的库 chrono&#xff0c;通过 chrono 库可以很方便地处理日期和时间&#xff0c;为程序的开发提供了便利。chrono 库主要包含三种类型的类&#xff1a;时间间隔duration、时钟clocks、时间点time point。 1.1 基本常…

[计算机网络]---Https协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、https协…

课上题目代码

dijkstra和spfa区别 &#xff1a; dikstra是基于贪心的思想&#xff0c;每次选择最近的点去更新其它点&#xff0c;过后就不再访问。而在spfa算法中&#xff0c;只要有某个点的距离被更新了&#xff0c;就把它加到队列中&#xff0c;去更新其它点&#xff0c;所有每个点有被重…

Java中的线程(创建多线程的三种方法)

Java中的线程——创建 创建多线程方式一&#xff1a;继承Thread类方式二&#xff1a;实现Runnable接口方式三&#xff1a;实现Callable接口 线程的常用API 创建多线程 方式一&#xff1a;继承Thread类 定义一个子类MyThread继承线程类java.lang.Thread&#xff0c;重写run方法…