【无标题】

提示:opendir readir stat -->提取出来的数据写入到file.txt中

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#include <dirent.h>
#include <time.h>
#include <unistd.h>

int main(int argc, const char *argv[])
{
    //创建文件夹(文件夹路径,文件权限(数字码))
    int res;
/*  res = mkdir("./DIR/",0777);
    if(res<0)
    {
        if(errno != 17)
        {
            perror("mkdir");
            return -1;
        }
    }
*/  //打开文件,若文件不存在就创建文件
/*  res = open("./DIR/1.txt",O_WRONLY|O_CREAT|O_TRUNC,0775);
    if(res<0)
    {
        perror("open");
        return -1;
    }
*/
    //删除文件夹

    //打开文件夹
    DIR* op = opendir("./DIR/");
    if(NULL == op)
    {
        perror("opendir");
        return -1;
    }
    printf("打开目录成功\n");

    //打开z.txt文件
    int fd = open("../z.txt",O_WRONLY);
    if(fd < 0)
    {
        perror("open");
        return -1;
    }
    printf("fd=%d\n",fd);

    //读取文件夹
    struct dirent* rp = NULL;
    while(1)
    {
        rp = readdir(op);
        if(NULL == rp)
        {
            if(0 == errno)
                printf("目录被读取完毕\n");
            else
                perror("readdir");

            break;
        }
        printf("%s\n",rp->d_name);

        //判断文件是否是隐藏文件-->名字是否已.开头
/*      if(rp->d_name[0] == '.')
        {
            continue;
        }
*/
        //提取当前路径下所有文件的权限以及最后一次的访问时间
         struct stat fileStat; // 文件状态结构体
        if(stat(rp->d_name,&fileStat) == -1)
        {
            perror("stat");
            return -1;
        }

        printf("%s\n",rp->d_name);
        printf("Permissions: %o\n", fileStat.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)); // 输出文件权限
        //时间
        struct tm* info;                                                                                                                                                   
        info = localtime(&fileStat.st_atime);
        printf("%04d-%02d-%02d %02d-%02d-%02d\n",\
          info->tm_year+1900,info->tm_mon+1,info->tm_mday,\
          info->tm_hour,info->tm_min,info->tm_sec);


        //将获取的数据分别存入两个变量
        int time = fileStat.st_atime;
        int mode =  fileStat.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO);

        //将获取到的时间和权限写入z.txt文件
        ssize_t res = 0;
        res = write(fd,&time,sizeof(time));
        printf("res = %ld\n",res);
        res = write(fd,&mode,sizeof(mode));
        printf("res = %ld\n",res);
        printf("写入成功\n");

    }

    //关闭文件
    if(close(fd)<0)
    {
        perror("close");
        return -1;
    }


    //关闭文件夹
    if(closedir(op)<0)
    {
        perror("closedir");
        return -1;
    }
    else
    {
        printf("已关闭文件夹\n");
    }


    return 0;
}
                                                                                                                                                                           
                                                                                                                                                                           
                                                                                                                                                                           
                                                                                                                                                                           
                                                                                                                                                                           
                                                                                                                                                                           
                                                                                                                                                                           
                                                                                                                                                                           
                                                                                                                                                                           
                                                                                                                                                                           

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

提示:

图片就是一个普通文件,普通文件怎么拷贝,图片就怎么拷贝。读一个字符,写一个字符,循环size/2次

diff可以查看两个文件是否一致,例如diff 1.png 2.png,可以查看两张图片是否一致

终端输入:eog 1.png 可以打开1.png这张图片

 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <string.h>
 
 int main(int argc, const char *argv[])
 {
     int res;
     //打开照片文件
     int fd = open("./桌面背景.jpg",O_RDONLY);
     if(fd < 0)
     {
         perror("open");
         return -1;
     }
     printf("打开照片文件成功  fd = %d\n",fd);
 
     //打开承接照片的文件
     int fd1 = open("./copy.jpg",O_WRONLY|O_TRUNC|O_CREAT,0664);
     if(fd1 < 0)
     {
         perror("open");
         return -1;
     }
     printf("打开承接照片的文件成功  fd1 = %d\n",fd1);
 
 
 
 
     //计算图片大小
     off_t size = 0;
     size = lseek(fd,0,SEEK_END);
     printf("被复制的图片大小为:size=%ld\n",size);
 
 
     //创建子进程
     pid_t cpid = fork();
 
     if(cpid > 0)//父进程中为真
     {
         ssize_t res1;
         char c;
         int j=0;
         //将两个文件中的偏移量都设置到文件开头
         lseek(fd,0,SEEK_SET);
         lseek(fd1,0,SEEK_SET);
         while(j<size/2)
         {
             res1 = read(fd,&c,sizeof(c));
             write(fd1,&c,sizeof(c));
             j++;
         }
         printf("前半部分打印成功\n");
     }
     else if(0 == cpid)//子进程中为真
     {
         sleep(4);
         ssize_t res2;
         int i = size/2;
         char b;
         //将两个文件中的偏移量都设置到文件中间
         lseek(fd,size/2,SEEK_SET);
         lseek(fd1,size/2,SEEK_SET);
         while(i<size)                                                                              
         {
             read(fd,&b,sizeof(b));
             write(fd1,&b,sizeof(b));
             i++;
 
         }
         printf("打印完成\n");
     }
     else
     {
         perror("fork");
         return -1;
     }
 
     res = close(fd);
     if(res < 0)
     {
         perror("close");
         return -1;
     }
 
     res = close(fd1);
     if(res < 0)
     {
         perror("close");
         return -1;
     }
 
 
 
     return 0;
 }
                                                                                                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值