文件属性-access / chmod / chown / truncate / ftruncate / lseek

本文详细介绍了Linux下文件操作及权限管理的相关知识,包括使用access检测文件权限与存在性、利用chmod与chown更改文件权限与所有者、通过truncate调整文件大小,以及lseek在文件操作中的多种应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

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;        
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值