mode_t / st_mode
详解
access
int access(const char *pathname, int mode);
(1) 检测当前用户是否具有 [读/写/可执行] 权限:R_OK, W_OK, X_OK
(2) 检测文件是否存在F_OK
int main(int argc,char* argv[]){
if(argc<2){
printf("argc<2\n");
exit(1);
}
int ret = access(argv[1],F_OK); //判断文件是否存在
if(ret==-1){ //文件不存在,则创建一个文件
printf("file is not exist,create %s",argv[1]);
int fd=open(argv[1],O_RDWR|O_CREAT,0664);
}
}
chmod
与 strtol
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);
mode_t mode 文件权限,八进制数
int mode=strtol(argv[2],NULL,8); //将argv[2]转换成8进制的数
ret=chmod("test.bat",mode); //修改test.bat文件的权限为mode
chown 所有者| 所属组
int chown(const char *path, uid_t owner, gid_t group);
ret=chown(argv[1],1001,1002);
truncate / ftruncate
int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
比原来文件小,删除后边的部分;比原来文件大,向后扩展
例:ret=truncate(argv[1],1000); //扩展文件大小size
lseek
off_t lseek
(int fd,off_t offset,int whence);
offset:偏移量,可正可负
whence:SEET_SET、SEEK_CUR、SEEK_END
功能①:改变当前文件偏移量
功能②:扩展文件大小
[1]文件原大小100K,扩展成1100K
lseek(fd,1000,SEEK_END);
[2]必须做一次write写操作,才能扩展成功
write(fd,“a”,1);
代码举例:lseek扩展文件大小
int main(){
int fd=open("test",O_RDWR,0644);
if(fd==-1)
perror("open fail");
int ret=lseek(fd,1000,SEEK_END);
write(fd,"a",1); //必须write,才能扩展成功
printf("fdsize=%d\n",ret);
printf("fdsize=%d\n",lseek(fd,0,SEEK_END));
close(fd);
}
综合示例代码
int main(int argc,char* argv[]){
if(argc<3){
printf("argc<3\n");
exit(1);
}
int ret = access(argv[1],F_OK); //判断文件是否存在
if(ret==-1){
printf("file is not exist,create %s",argv[1]);
int fd=open(argv[1],O_RDWR|O_CREAT,0664); //创建文件
if(fd<0){
perror("create fail");
exit(-1);
}
}
int mode=strtol(argv[2],NULL,8); //将argv[2]转换成8进制的数
ret=chmod(argv[1],mode); //修改文件权限为mode
if(ret==-1){
perror("chmod fail");
exit(-1);
}
ret=chown(argv[1],1001,1002); //改变文件的[user group]
if(ret==-1){
perror("chown fail");
exit(1);
}
ret=truncate(argv[1],1000); //扩展文件大小size
if(ret==-1){
perror("truncate fail");
exit(-1);
}
return 0;
}