4.14作业

1.要求将指定路径下,所有文件(除了隐藏文件)的权限及最后一次的访问时间提取出来,写入到file.txt中!! 提示:opendir readir stat(路径及文件名) -->提取出来的数据写入到file.txt中

 #include <stdio.h>
 #include <sys/types.h>
 #include <dirent.h>
 #include <errno.h>
 #include <sys/stat.h>
 #include <unistd.h>
 #include <time.h>
 #include <fcntl.h>
 #include <string.h>
 
 
 void modeBin(int a,char arr[])
 {
     for(int i=8;i>=0;i--)
     {
         arr[i]= a%2;
         if(i>2)   arr[i]=(a%2==1&&i%3==0) ? 'R' : ((a%2==1&&i%3==1)?'W':((a%2==1&&i%3==2)?'X': '-'));
         else   arr[i]=(a%2==1&&i==0) ? 'R' : ((a%2==1&&i==1)?'W':((a%2==1&&i==2)?'X': '-'));
         a=a/2;
     }
     arr[9]='\0';
 }
 
 int main(int argc, const char *argv[])
 {
     struct dirent* rdir;
     struct stat sdir;
     struct tm* tdir;
 
     if(argv < 2)
     {
         printf("请输入要打开的文件夹路径\n");
         return -1;
     }
     DIR* pdir=opendir(argv[1]);
     if(pdir == NULL)
     {
         perror("目录");
         return -1;
     }
     int b = open("./file.c",O_WRONLY | O_CREAT | O_APPEND,0775);                                                                                                                                
     if(b < 0)
     {
         perror("文件打开");
         return -1;
     }
     while(1)
     {
         rdir = readdir(pdir);
         if(rdir==NULL)
         {
             perror("读取");
             break;
         }
         if(rdir->d_name[0] != '.')
         {
             char agr[128],arr[128],date[128];
             sprintf(agr,"%s/%s",argv[1],rdir->d_name);
             printf("%s\n",agr);
             if(stat(agr,&sdir) != 0)
             {
                 perror("文件信息");
                 break;
             }
             tdir=localtime(&sdir.st_atim);
             printf("%d\n",sdir.st_mode);
             modeBin(sdir.st_mode,arr);
             sprintf(date,"%s\t%s\t%d-%02d-%02d %02d:%02d:%02d\n",agr,arr,tdir->tm_year+1900,tdir->tm_mon+1,tdir->tm_mday,tdir->tm_hour,tdir->tm_min,tdir->tm_sec);
             printf("%s",date);
             write(b,date,strlen(date));
             bzero(agr,128);
             bzero(date,128);
         }
     }
     close(b);
     closedir(pdir);
     return 0;
 }

2.使用文件IO对图片进行拷贝。要求子进程拷贝后半部分,父进程拷贝前半部分。

提示:

  • 图片就是一个普通文件,普通文件怎么拷贝,图片就怎么拷贝。读一个字符,写一个字符,循环size/2次
  • diff可以查看两个文件是否一致,例如diff 1.png 2.png,可以查看两张图片是否一致
  • 终端输入:eog 1.png 可以打开1.png这张图片
 #include <stdio.h>
 #include <sys/types.h>
 #include <unistd.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <sys/stat.h>
 
 int main(int argc, const char *argv[])
 {
     char arr;
     int cnt=0;
     struct stat d;
     int b=open(argv[1],O_RDONLY);
     int c=open("2.png",O_WRONLY|O_CREAT|O_APPEND,0775);
     if(b<0 || c<0)
     {
         perror("文件打开");
         return -1;
     }
     stat(argv[1],&d);
     pid_t a=fork();
     if(a>0&&cnt==0)
     {
         for(int i=0;i<d.st_size/2;i++)
         {
             read(b,&arr,1);
             write(c,&arr,1);
             if(i+1==d.st_size/2) cnt=1;
         }
 
     }
     if(cnt==1)
     {
 
         for(int i=d.st_size/2;i<d.st_size;i++)
         {
             read(b,&arr,1);
             write(c,&arr,1);
             if(i==d.st_size)
             {
                 close(c);
                 close(b);                                          
                 return -1;
             }
         }
     }
     return 0;
 }
 

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值