提示: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;
}