要求将当前路径下,所有文件的权限及最后一次的访问时间提取出来,写入到fie.txt中
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <time.h>
int main(int argc, const char *argv[])
{
// 打开文件夹
DIR* op = opendir("./");
struct stat buf;
if (NULL == op)
{
perror("opendir");
return -1;
}
FILE* fp = fopen("file.txt", "w");
if (NULL == fp)
{
perror("fopen");
return -1;
}
printf("目录打开成功\n");
// 读取文件夹
struct dirent* rp = NULL;
while ((rp = readdir(op)) != NULL)
{
if (strcmp(rp->d_name, ".") == 0 || strcmp(rp->d_name, "..") == 0)
{
continue;
}
if (stat(rp->d_name, &buf) < 0)
{
perror("stat");
return -1;
}
}
rewinddir(op);
while ((rp = readdir(op)) != NULL)
{
if (strcmp(rp->d_name, ".") == 0 || strcmp(rp->d_name, "..") == 0)
{
continue;
}
if (stat(rp->d_name, &buf) < 0)
{
perror("stat");
return -1;
}
//S_IRWXU表示与的读写执行权限
//S_IRWXG组用户
//S_IRWXO其他用户
struct tm* t = localtime(&buf.st_ctime);
fprintf(fp, "%s %o %d-%02d-%02d %02d:%02d:%02d\n",\
rp->d_name, buf.st_mode & (S_IRWXU | S_IRWXG |S_IRWXO),\
t->tm_year + 1900, t->tm_mon + 1, t->tm_mday,\
t->tm_hour, t->tm_min, t->tm_sec);
}
// 关闭文件夹
if (closedir(op) < 0)
{
perror("closedir");
return -1;
}
fclose(fp);
printf("数据已写入到file.txt文件中\n");
return 0;
}
使用文件IO对图片进行拷贝。要求子进程拷贝后半部分,父进程拷贝前半部分。
提示:
1.图片就是一个普通文件,
普通文件怎么拷贝,图片就怎么拷贝。读一个字符,写一
个字符,循环size/2次
2.diff可以查看两个文件是否一致,例如diff 1.png 2.png,可以查看两张图片是否
致
终端输入: eog 1.png 可以打开1.png这张图片
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(int argc, const char *argv[])
{
int fd1, fd2;
pid_t pid;
off_t size, half_size; // 文件大小和一半大小
// 打开输入文件
fd1 = open("./1.jpg", O_RDONLY);
if (fd1 < 0) {
perror("open");
return -1;
}
// 获取文件大小和一半大小
size = lseek(fd1, 0, SEEK_END);
half_size = size / 2;
// 创建输出文件
/*O_RDWR: 表示以读写模式打开文件。这意味着可以对文件进行读取和写入操作。
O_CREAT: 如果文件不存在,则创建文件。如果文件已经存在,则不会进行任何操作。
O_TRUNC: 如果文件已经存在,并且以写入模式打开,则截断文件为零长度。这意味着文件内容将被清空。
* */
fd2 = open("./2.jpg", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd2 < 0) {
perror("open");
return -1;
}
// 创建子进程
pid = fork();
if (pid < 0) {
perror("fork");
return -1;
}
if (pid == 0) { // 子进程拷贝后半部分
lseek(fd1, half_size, SEEK_SET);
char buffer[1];
for (off_t i = half_size; i < size; i++) {
if (read(fd1, buffer, 1) != 1) {
perror("read");
return -1;
}
if (write(fd2, buffer, 1) != 1) {
perror("write");
return -1;
}
}
} else { // 父进程拷贝前半部分
size = half_size;
char buffer[1];
for (off_t i = 0; i < size; i++) {
if (read(fd1, buffer, 1) != 1) {
perror("read");
return -1;
}
if (write(fd2, buffer, 1) != 1) {
perror("write");
return -1;
}
}
}
close(fd1);
close(fd2);
if (pid > 0) {
wait(NULL); // 等待子进程结束
}
printf("拷贝完成\n");
return 0;
}