Linux文件:
用文件描述符号 绑定 一个文件
文件描述符号: File Describe 简称 fd 本质是个整数
操作系统内核会维护这个整数,把它和硬盘中的一个文件联系在一起,互为映射
标准fd
0 标准输入 stdin
1 标准输出 stdout
2 标准错误输出 stderror
都是终端设备
lseek 挪文件内容指针
SEEK_SET 文件头
SEEK_END 文件尾
SEEK_CUR 当前位置
头文件有点多,不过不用管,毕竟一口气全复制过去以后用啥直接就能用不用再考虑头文件
#include <stdio.h>
#include <unistd.h> //linux操作系统标准头文件
#include <string.h> //memcpy
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h> //umask
#include <time.h>
#include <sys/time.h>
#include <dirent.h> //遍历目录
#include <fcntl.h> //文件映射虚拟内存
#include <sys/mman.h>
#include <wait.h>
#include <signal.h> //SIGCHLD
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>
void writeFile(int argc, char *argv[])
{
if (argc < 2)
{
printf("请命令行输入文件名\n");
exit(-1);
}
int fd = open(argv[1], O_WRONLY);
if (-1 == fd)
{
// 错误信息会直接通过%m输出出来
printf("打开%s失败:%m\n", argv[1]);
fd = open(argv[1], O_WRONLY | O_CREAT, 0666);
if (-1 == fd)
{
printf("创建%s失败:%m\n", argv[1]);
exit(-1);
}
printf("创建文件成功\n");
}
printf("打开文件成功\n");
char name[100];
memset(name, 0, sizeof(name));
char temp[20];
memset(temp, 0, sizeof(temp));
int age;
double score;
write(1, "请输入姓名:", strlen("请输入姓名:") + 1);
read(0, name, 100);
write(1, "请输入年龄:", strlen("请输入年龄:") + 1);
read(0, temp, 20);
age = atoi(temp);
write(1, "请输入成绩:", strlen("请输入成绩:") + 1);
bzero(temp, 0);
read(0, temp, 20);
score = atof(temp);
char s[100];
memset(s, 0, sizeof(s));
sprintf(s, "%s同学今年%d岁了,考了%f分", name, age, score);
// write(1,s,100);
write(fd, s, 100);
close(fd);
}
// 读文件
void readFile(int argc, char *argv[])
{
if (argc < 2)
{
printf("请命令行输入文件名\n");
exit(-1);
}
int fd = open(argv[1], O_RDONLY);
if (-1 == fd)
{
printf("打开%s失败:%m\n", argv[1]);
exit(-1);
}
printf("打开文件成功\n");
char arr[100];
read(fd, arr, 100);
printf("%s\n", arr);
close(fd);
}
// 读取文件状态
// void fileStat(int argc, char *argv[])
// {
// if (argc < 2)
// {
// printf("请命令行输入文件名\n");
// exit(-1);
// }
// struct stat st;
// int ret = stat(argv[1], &st);
// if (-1 == ret)
// {
// printf("获取文件状态失败:%m\n");
// exit(-1);
// }
// printf("最终修改时间:%ld %ld\n", st.st_atim.tv_sec, st.st_atim.tv_nsec);
// struct tm *t = localtime(&st.st_atim);
// printf("%d-%d-%d %d:%d:%d 星期%d\n", t->tm_year, t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, t->tm_wday);
// printf("文件类型%d\n", st.st_mode);
// if (st.st_mode & S_IFDIR)
// {
// printf("%s是个目录\n", argv[1]);
// }
// else
// {
// printf("%s是个文件\n", argv[1]);
// }
// printf("文件大小%ld\n", st.st_size);
// }
// 拷贝文件
void fileCp(int argc, char *argv[])
{
if (argc < 3)
{
printf("请命令行输入文件名和拷贝后的文件名\n");
exit(-1);
}
// 拷贝argv[1] 为 argv[2]
int fdSrc = open(argv[1], O_RDONLY);
if (-1 == fdSrc)
{
printf("打开待拷贝文件失败:%m");
exit(-1);
}
int fdDst = open(argv[2], O_WRONLY | O_CREAT, 0666);
if (-1 == fdDst)
{
printf("打开拷贝后的文件失败:%m");
exit(-1);
}
// 循环读取并写入
int r;
char temp[1024];
while (1)
{
r = read(fdSrc, temp, 1024);
if (r <= 0)
break; // 没读到就退出
write(fdDst, temp, r); // 读到多少写多少
}
close(fdDst);
close(fdSrc);
printf("拷贝完毕\n");
system("ls");
}
// 移动文件
/*
void fileMv(int argc, char *argv[])
{
if (argc < 3)
{
printf("请命令行输入文件名和拷贝后的文件名\n");
exit(-1);
}
struct stat st;
int ret = stat(argv[2], &st);
if (-1 == ret)
{
printf("获取文件状态失败:%m\n");
exit(-1);
}
int fdSrc = open(argv[1], O_RDONLY);
if (-1 == fdSrc)
{
printf("打开待拷贝文件失败:%m");
exit(-1);
}
int fdDst;
if (st.st_mode & S_IFDIR)
{ // 是目录,移动,拷贝到指定目录后删除
char dstName[256] = {0};
sprintf(dstName, "%s/%s", argv[2], argv[1]);
fdDst = open(dstName, O_WRONLY | O_CREAT, 0666);
if (-1 == fdDst)
{
printf("目录if内\n");
printf("打开拷贝后的文件失败:%m\n");
exit(-1);
}
}
else
{
// 不是目录,重命名,复制到当前目录后后删除
printf("else内\n");
fdDst = open(argv[2], O_WRONLY | O_CREAT, 0666);
if (-1 == fdDst)
{
printf("打开拷贝后的文件失败:%m\n");
exit(-1);
}
}
// 循环读取并写入
int r;
char temp[1024];
while (1)
{
r = read(fdSrc, temp, 1024);
if (r <= 0)
break; // 没读到就退出
write(fdDst, temp, r); // 读到多少写多少
}
unlink(argv[1]); // 删除当前源
close(fdDst);
close(fdSrc);
printf("移动完毕\n");
system("ls");
}
*/
int main(int argc, char *argv[])
{
// readFile(argc,argv);
// fileStat(argc,argv);
// fileCp(argc,argv);
// fileMv(argc, argv);
return 0;
}