Linux-文件属性操作函数

C++程序员必会知识


  • int access(const char *pathname,int mode);   //access使用权        

        作用:判断某个文件是否有某个权限,或者判断文件是否存在

        参数:

                pathname:文件路径

                mode:      R_OK 判断是否有读权限

                                W_OK 判断是否有写权限

                                X_OK 判断是否有执行权限

        返回:        成功返回 0  失败 -1

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc,char *argv[]){

    if(argc < 2){
        printf("%s filename\n",argv[0]);
        exit(0);
    }

    int res = access(argv[1],F_OK);
    if(res == -1){
       perror("access");
        return 0;
    }

    printf("ok\n");


    return 0;
}
  •    int chmod(const char*filename,int mode);

        作用:修改文件的权限

        参数:

                pathname:文件路径

                mode:      八进制数

        返回:        成功返回 0  失败 -1

  • int chown(const char *path,wid_t ower,git_t group);

        作用:修改文件的所有者和所有组   /etc/passwd      /etc/group

        参数:

                path:文件路径

               ower:修改后的所有者

                group:修改后的所有组

        返回:        成功返回 0  失败 -1

  

  • int truncate(const char*path,off_t length);

        作用:缩减或者扩展文件的尺寸至指定大小

        参数:

                path:文件路径

               length:问价大小

        返回:        成功返回 0  失败 -1

  • int stat(const char*pathname,struct stat *statbuf);

        作用:获取文件相关的一些信息

        参数:statbuf  传出参数,保存文件相关的信息 ,stat是一个结构体

                

         返回:        成功返回 0  失败 -1

  •  st_mode变量(16位的整数)---需要用的时候去查相应的宏

  我们在终端输入ll时最前的那个串(特殊权限位我们一般不需要考虑)

  

 

 文件类型的判断:st_mode & S_IFMT就可以得到相应的文件类型的宏

 其实我们在使用 open函数时也一样,为什么哟啊用 | 来设置权限呢?

就是因为每一个位都代表了不同的含义,通过或操作就可以把相应的位设置为1,如此以来就可以得到相应的权限了。

所有者权限 

所有组权限

 其它人

 stat小案例:模拟ls filename

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int main(int argc,char *argv[]){

    //判断输入的参数是否正确
    if(argc < 2){
        printf("%s filename\n",argv[0]);
        return 0;
    }
    //通过stat函数获取用户传入的文件信息
    struct stat st;         //保存用户的信息
    int res = stat(argv[1],&st);
    if(res == -1){
        perror("stat");
        exit(-1);
    }

    //保存文件类型和权限
    char perms[11] = {0};    
    //通过st获取文件类型
             
    switch(st.st_mode & S_IFMT){
        case S_IFLNK://如果是链接
            perms[0] = 'l';
            break;
        case S_IFREG://如果是普通文件         
            perms[0] = '-';
            break;
        case S_IFDIR://如果是文件夹
            perms[0] = 'd';     
            break;
        case S_IFBLK://如果是块文件
            perms[0] = 'd';   
            break;
        case S_IFIFO://如果是管道
            perms[0] = 'p';         
            break;
        case S_IFCHR://如果是字符设备
            perms[0] = 'c';  
            break;
        case S_IFSOCK://如果是套接字
            perms[0] = 's';  
            break;
        default:
            break;
    }

    //获取文件权限
    //1.文件所有者
    perms[1] = (st.st_mode & S_IRUSR) ? 'r':'-';
    perms[2] = (st.st_mode & S_IWUSR) ? 'w':'-';
    perms[3] = (st.st_mode & S_IXUSR) ? 'x':'-';
    //2.文件所有组
    perms[4] = (st.st_mode & S_IRGRP) ? 'r':'-';
    perms[5] = (st.st_mode & S_IWGRP) ? 'w':'-';
    perms[6] = (st.st_mode & S_IXGRP) ? 'x':'-';
    //3.其他人
    perms[7] = (st.st_mode & S_IROTH) ? 'r':'-';
    perms[8] = (st.st_mode & S_IWOTH) ? 'w':'-';
    perms[9] = (st.st_mode & S_IXOTH) ? 'x':'-';
    
    //获取硬连接数
    int linkNum = st.st_nlink;
    //文件所有者
    char *fileUser = getpwuid(st.st_uid)->pw_name;
    //文件所有组
    char *fileGup  = getgrgid(st.st_gid)->gr_name;
    //文件大小
    long int fileSize = st.st_size;
    //获取修改时间
    char *time = ctime(&st.st_mtime);
    char mtime[512] = {0};
    strncpy(mtime,time,strlen(time)-1);
    
    //输出buf
    char buf[1024] = {0};
    sprintf(buf,"%s  %d  %s  %s  %ld   %s\n",perms,linkNum,fileUser,fileGup,fileSize,mtime);
    
    printf("%s\n",buf);


    return 0;
}
  • int  open(const char* pathname,int flags);                              //打开文件
  • int open(const char* pathname,int flags,mode_t mode);        //创建文件

参数:pathname 要创建的文件路径

        flags:对文件的操作权限和其它设置

                必选项:O_RDONLY  O_WRONLY   O_RDWR

                可选项:O_CREATE

        

  每一个标志位都对应着一种权限(例如可写、可读)

mode:八进制数,表示创建出来的操作权限,eg:0777

正真的权限mode & umask[umask是系统提供的掩码,默认为 0775==>限制某些权限,防止误操作]

补充:error,在系统函数中很多函数发生错误时,会设置error

error:/usr/include/errno.h   ==>   定义在文件中

  1. 定义在头文件  errno.h中,是个全局变量 
  2. 任何标准c库函数都可以对其进行改变(Linux系统函数更可以)
  3. 错误宏定义的位置:1~34    -->/user/include/asm-generic/errno-base.h                           35~133-->/user/include/asm-generic/errno.h
  4. 是记录系统的最后一次错误代码(其实就是一个int值):每一个errno值都对应着以字符串对应的字符串、当调用"某些"函数出错时,该函数会重新设置error的值
  5. 配用的c库函数perror     void  perror(const char*s)                                                                          函数说明:默认情况下将错误信息打印到终端,参数s所指的字符串会先打印出,后面再加                         上错误原因字符串。                      
  •  ssize_t read(int fd,void *buf,size_t count);

        作用:从fd指向的文件中读取(复制)count字节的数据到buf中 

  • ssize_t write(int fd,const void*buf,size_t count);

         作用:将buf中的内容写入fd指向的文件中,写入count个字节

  • off_t   lseek(int fd,off_t offset,int whence); 

         作用:移动文件指针到文件头部   lseek(fd,0,SEEK_SET);

                 获取当前的文件指针所在的位置   lseek(fd,0,SEEK_CUR);

                 获取文件的长度  lseek(fd,0,SEEK_END);

                 扩展文件的长度   lseek(fd,100,SEEK_END);//扩展100字节

                                              write(fd," ",1);//必须写操作,才可实现扩展

        参数:

                offset:偏移量-->相对于文件指针当前的位置

                whence-->SEEK_SET文件头   SEEK_CUR当前位置   SEEK_END文件尾

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(){

    //打开一个文件
    int fd = open("a.txt",O_RDWR | O_CREAT);
    if(fd == -1){
        perror("open");
        exit(-1);
    }

    //向文件中写东西
    char buf[1024] = {0};
    sprintf(buf,"%s","aaaaaaaaaaaaaa");
    ssize_t size = write(fd,buf,sizeof(buf));

    //获取文件中的数据
    lseek(fd,0,SEEK_SET);           //写入操作会是文件指针移动到文件末尾
    memset(buf,0,sizeof(0));
    size = read(fd,buf,sizeof(buf));
    printf("%s\n",buf);

    //获取文件大小
    off_t s = lseek(fd,0,SEEK_END);
    printf("当前文件大小为:%ld\n",s);
    //扩展文件truncate  lseek都可以,建议使用truncate
    int res = truncate("a.txt",1024);
    if(res == -1){
        perror("truncate");
        exit(-1);
    }
    //获取文件大小
    s = lseek(fd,0,SEEK_END);
    printf("当前文件大小为:%ld\n",s);

    //扩展文件truncate  lseek都可以,建议使用truncate
    lseek(fd,100,SEEK_END);
    write(fd," ",1);
    //获取文件大小
    s = lseek(fd,0,SEEK_END);
    printf("当前文件大小为:%ld\n",s);


    return 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@陈一言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值