Linux-文件属性操作函数

简介: 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;
}
相关文章
|
11天前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
36 5
|
11天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
30 6
|
11天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
40 6
|
12天前
|
监控 Linux Perl
Linux 命令小技巧:显示文件指定行的内容
在 Linux 系统中,处理文本文件是一项常见任务。本文介绍了如何使用 head、tail、sed 和 awk 等命令快速显示文件中的指定行内容,帮助你高效处理文本文件。通过实际应用场景和案例分析,展示了这些命令在代码审查、日志分析和文本处理中的具体用途。同时,还提供了注意事项和技巧,帮助你更好地掌握这些命令。
28 4
|
18天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
41 2
|
17天前
|
缓存 监控 Linux
|
20天前
|
Linux Shell 数据库
文件查找是Linux用户日常工作的重要技能介绍了几种不常见的文件查找方法
文件查找是Linux用户日常工作的重要技能。本文介绍了几种不常见的文件查找方法,包括使用`find`和`column`组合、`locate`和`mlocate`快速查找、编写Shell脚本、使用现代工具`fd`、结合`grep`搜索文件内容,以及图形界面工具如`Gnome Search Tool`和`Albert`。这些方法能显著提升文件查找的效率和准确性。
40 2
|
24天前
|
Linux 数据库
linux 全局搜索文件
在 Linux 系统中,全局搜索文件常用 `find`、`locate` 和 `grep` 命令。`find` 根据文件名、类型、大小、时间戳等条件搜索;`locate` 通过预构建的数据库快速查找文件;`grep` 在文件中搜索特定文本,常与 `find` 结合使用。选择合适的命令取决于具体需求。
|
27天前
|
Linux 开发工具 Perl
Linux命令替换目录下所有文件里有"\n"的字符为""如何操作?
【10月更文挑战第20天】Linux命令替换目录下所有文件里有"\n"的字符为""如何操作?
38 4
|
26天前
|
运维 安全 Linux
Linux文件清空的五种方法总结分享
每种方法各有优势,选择最合适的一种或几种,可以极大提高您的工作效率。更多有关Linux系统管理的技巧与资源,欢迎访问,持续提升您的运维技能。
63 1
下一篇
无影云桌面