以下内容为详细代码
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{
int ret;//返回值
int fd;
char buff[1024];
if(argc != 3)
{
printf("参数错误!\n");
return -1;
}
ret = access(argv[1],F_OK);//判断文件是否存在
if(0 != ret)
{
printf("%s不存在!\n",argv[1]);
return -1;
}
ret=access(argv[1], R_OK);//判断是否有读权限
if(0 != ret)
{
printf("没有对文件的操作权限!");
return -1;
}
//有读权限那么就读取文件内容
fd = open(argv[1],O_RDONLY);//以只读的方式打开文件
//读取失败
if(fd<0)
{
perror("open");
close(fd);
return -1;
}
ret = read(fd, buff, sizeof(buff));
buff[ret] = '\0';
close(fd);
//创建新的文件,并把内容粘贴进去,这里不考虑重名
fd = open(argv[2], O_WRONLY|O_CREAT, 0777);//(以只写的方式打开文件|文件不存在则创建)
if(fd<0)
{
printf("创建新文件失败!\n");
return -1;
}
//写入文件
ret = write(fd, buff, strlen(buff));
//判断写入是否成功
if(ret<0)
{
perror("write");
close(fd);
return -1;
}
close(fd);
return 0;
}
下图为.c文件的编译与运行
首先查看一下当前目录下面的文件:ls
我们开始编译写好的文件:gcc copy.c -o copy.out
运行(第一个为原文件,第二个为另存为的文件): ./copy.out hi.txt haha.txt
再查看一下当前目录下的文件,发现已经有了
对比一下两个文件的内容(这里设置一次读取最大为buff[1024],可根据需求更改大小或者多次读取)
两个txt文件为何颜色不同?因为他们的权限不同。
这里只需要修改一下fd = open(argv[2], O_WRONLY|O_CREAT, 0777);
为fd = open(argv[2], O_WRONLY|O_CREAT, 0644);
再编译运行就能得到和原文件相同的权限。
注:
有关新建文件权限的确定,先查阅一下open的手册:
第二页里面有详细说明,首先是open用到的头文件,然后是参数说明
有关第三个参数mode,这里有详细介绍。
如果是新创建的文件,需要用mode(八进制的形式)和~umask按位相与。
查看一下掩码umask(八进制的形式):
转换为2进制的形式写出来就是:000 010 010
按位取反: 111 101 101
再和mode(0644): 110 100 100
按位相与得到: 110 100 100
对应权限就是: rw- r-- r--