IO、进程、线程03

第一题:预习 opendir 和 readdir函数

opendir 和 readdir 是两个在C语言(特别是使用POSIX标准的系统,如Linux和UNIX)中用于目录遍历的函数。这两个函数属于标准的C库中的目录操作部分,通常与<dirent.h>头文件一起使用。下面详细介绍这两个函数的作用和用法。

opendir 函数

opendir 函数用于打开一个目录流,以便通过 readdir 函数读取目录内容。

函数原型

#include <dirent.h>  
#include <sys/types.h>  
  
DIR *opendir(const char *name);
参数
  • name:指向以null结尾的字符串的指针,该字符串指定了要打开的目录的路径。

返回值

  • 成功时,返回一个指向DIR类型的指针,该指针代表打开的目录流。
  • 失败时,返回NULL,并设置errno以指示错误。

readdir 函数

readdir 函数用于读取目录流中的下一个目录项。

函数原型

#include <dirent.h>  
  
struct dirent *readdir(DIR *dirp);
参数
  • dirp:指向之前通过opendir函数打开的目录流的指针。

返回值

  • 成功时,返回一个指向dirent结构的指针,该结构包含目录项的信息。
  • 读取到目录末尾或出错时,返回NULL。要区分这两种情况,可以检查errno或使用errno的包装函数,如feof(dirfd(dirp))(但注意,feof并不直接适用于目录流,这里只是提供一个类比)。实际上,当到达目录末尾时,errno不会被设置。

第二题:通过 opendir、readdir、write、read函数实现拷贝一个文件夹中的所有文件的功能(不考虑文件夹中还有文件夹的情况)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
 
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
 
int main(int argc, const char *argv[])
{
	if(access(argv[2],F_OK) == -1)//判断目标文件夹是否存在
	{
		mkdir(argv[2],0777);//不存在则创建目标文件夹
	}else//如果存在,则需要判断该文件是否为目录文件
	{
		struct stat buf={0};
		stat(argv[2],&buf);
		mode_t mode=buf.st_mode;
		if(S_ISDIR(mode) != 1)
		{
			fprintf(stderr,"该文件不是一个目录文件!\n");
			return 1;
		}
	}
	DIR* df=opendir(argv[1]);
	if(dp == NULL)
	{
		perror("opendir");
		return 1;
	}
	while(1)
	{
		struct dirent* dt=readdir(df);
		if(dt == NULL)
		{
			break;
		}
		if(strcmp(dt->d_name,".")==0 || strcmp(dt->d_name,"..")==0)
		{
			continue;
		}
		chdir(argv[1]);//把工作目录切换到argv[1]里面
		int rfd=open(dt->d_name,O_RDONLY);
		if(rfd == -1)
		{
			perror("ropen");
		}
		chdir("..");//把工作目录切换到上一级目录
		chdir(argv[2]);
		int wfd=open(dt->d_name,O_WRONLY | O_CREAT | O_TRUNC,0666);
		if(wfd == -1)
		{
			perror("wopen");
		}
		chdir("..");
		while(1)
		{
			char s[16]={0};
			int res=read(rfp,s,15);
			if(res == 0)
			{
				breaak;
			}
			write(wfp,s,strlen(buf));
		}
	}
	close(rfp);
	close(wfp);
	closedir(df);
	return 0;
}

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 23:12:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 23:12:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 23:12:01       58 阅读
  4. Python语言-面向对象

    2024-07-18 23:12:01       69 阅读

热门阅读

  1. c/c++:多线程下调用exit接口函数的问题

    2024-07-18 23:12:01       20 阅读
  2. 国王(C++)

    2024-07-18 23:12:01       23 阅读
  3. @RequestBody接收到的参数中如何限制List的长度?

    2024-07-18 23:12:01       23 阅读
  4. QEMU源码全解析 —— CPU虚拟化(3)

    2024-07-18 23:12:01       23 阅读
  5. 爱心代码来啦!

    2024-07-18 23:12:01       28 阅读
  6. linux设置Nginx自动重启

    2024-07-18 23:12:01       21 阅读
  7. 线程池知识点

    2024-07-18 23:12:01       21 阅读
  8. LeetCode-计数质数

    2024-07-18 23:12:01       22 阅读
  9. Lua 数组

    2024-07-18 23:12:01       22 阅读