IO、进程、线程03

2024-07-19 1521阅读

IO、进程、线程03

第一题:预习 opendir 和 readdir函数

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

opendir 函数

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

函数原型:

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

    返回值:

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

      readdir 函数

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

      函数原型:

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

        返回值:

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

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

          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
          #include 
           
          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;
          }
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]