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;
}