首页 > 系统相关 >Linux文件和目录操作函数

Linux文件和目录操作函数

时间:2023-10-28 09:34:28浏览次数:44  
标签:文件 const 函数 int char 描述符 Linux include 目录

1.文件系统

1.1 文件存储

1.1.1 inode

  本质:struct 结构体。存储文件的属性信息。如:权限、类型、大小、时间、用户、盘块位置

  大多数的 inode 保存在磁盘中,少量常用、近期使用的 inode 保存在内存中

1.1.2 dentry 目录项

  本质:struct 结构体 {文件名、inode 号 ...} 文件内容保存在盘块中

1.1.3 文件系统

  一组规则,规定对文件的存储及读取的方式、方法。在磁盘格式化时指定。如:fat32、ntfs、ext2/3/4

2.文件操作

2.1 stat 和 lstat

  功能:查看文件信息

#include <sys/stst.h>
struct stat statbuf;    // 传入&statbuf用于接收文件属性信息
int stat(const char* pathname, struct stat* statbuf);    // 会穿透符号链接(软连接)
int lstat(const char* pathname, struct stat* statbuf);    // 不会穿透符号链接(软连接)
/*
    pathname: 文件名
    statbuf: 传出参数,充当返回值,保存文件属性信息

    return: 成功0, 失败-1 errno
*/
  • 文件大小:statbuf.st_size
  • 文件类型:statbuf.st_mode

2.2 access

  功能:测试指定文件是否具有某种属性

#include <unistd.h>
​
int access(const char *pathname, int mode);
/*
    pathname:文件名
    mode:文件权限,4种权限
        R_OK:   是否有读权限
        W_OK:   是否有写权限
        X_OK:   是否有执行权限
        F_OK:   测试文件是否存在

    return:
    0:有某种权限,或者文件存在
    -1:没有,或文件不存在
*/

2.3 chmod

  功能:修改文件权限

#include <sys/stat.h>
​
int chmod(const char *pathname, mode_t mode);
/*
    参数:
        filename:文件名
        mode:权限(8进制数)
    返回值:
        成功:0
        失败:-1
*/

2.4 chown

  功能:修改文件所有者和所属组

#include <unistd.h>
​
int chown(const char *pathname, uid_t owner, gid_t group);
/*
    参数:
        pathname:文件或目录名
        owner:文件所有者id,通过查看 /etc/passwd 得到所有者id
        group:文件所属组id,通过查看 /etc/group 得到用户组id
    返回值:
        成功:0
        失败:-1
*/

2.5 truncate

  功能:修改文件大小

#include <unistd.h>
#include <sys/types.h>
​
int truncate(const char *path, off_t length);
/*
    参数:
        path:文件文件名字
        length:指定的文件大小
            a)比原来小, 删掉后边的部分
            b)比原来大, 向后拓展
    返回值:
        成功:0
        失败:-1
*/

2.6 symlink

  功能:创建一个软链接

#include <unistd.h>
​
int symlink(const char *target, const char *linkpath);
/*
    参数:
        target:源文件名字
        linkpath:软链接名字
    返回值:
        成功:0
        失败:-1
*/

2.7 link

  功能:创建一个硬链接

#include <unistd.h>
​
int link(const char *oldpath, const char *newpath);
/*
    参数:
        oldpath:源文件名字
        newpath:硬链接名字
    返回值:
        成功:0
        失败:-1
*/

2.8 unlink

  功能:删除一个文件(软硬链接文件)

#include <unistd.h>
​
int unlink(const char *pathname);
/*
    参数:
        pathname:删除的文件名字
    返回值:
        成功:0
        失败:-1
*/
  • 调用unlink,只是让文件具备了被释放的条件,但不一定被立即释放
  • 硬链接计数为0(没有dentry对应)的文件仍然不会被立刻释放,只有所有打开该文件的进程都结束后,系统才会择机释放该文件

3. 目录操作

3.1 opendir

#include <dirent.h>
DIR* opendir(const char* name);
// 根据相对或绝对路径得到目录指针

3.2 closedir

#include <dirent.h>
int closedir(DIR* dirp);
// 根据给定的目录关闭

3.3 readdir

#include <dirent.h>
struct dirent* readdir(DIR* dirp);

struct dirent
{
    ino_t d_ino;                  // 此目录进入点的inode
    off_t d_off;                    // 目录文件开头至此目录进入点的位移
    signed short int d_reclen;      // d_name 的长度, 不包含NULL 字符
    unsigned char d_type;           // d_type 所指的文件类型 
    char d_name[256];               // 文件名
};

 4.文件描述符复制

4.1 dup

功能:通过 oldfd 复制出一个新的文件描述符,新的文件描述符是调用进程文件描述符表中最小可用的文件描述符,最终 oldfd 和新的文件描述符都指向同一个文件。

#include <unistd.h>
​
int dup(int oldfd);
/*
    参数:
        oldfd : 需要复制的文件描述符 oldfd
    返回值:
            成功:新文件描述符
            失败: -1
*/

应用举例

save_fd = dup(STDOUT_FILENO);    // 拿到标准输出的文件描述符
write(save_fd, msg, strlen(msg));    // 数据会被写到屏幕

4.2 dup2

功能:把 参数1 的文件描述符覆盖到 参数2 的文件描述符,效果是 参数1 和 参数2 的文件描述符变成相同的

#include <unistd.h>
​
int dup2(int oldfd, int newfd);
/*
    参数:
        oldfd : 需要复制的文件描述符
        newfd : 新的文件描述符,这个描述符可以人为指定一个合法数字(0 - 1023),如果指定的数字已经被占用(和某个文件有关联),此函数会自动关闭 close() 断开这个数字和某个文件的关联,再来使用这个合法数字。
    返回值:
        成功:返回 newfd
        失败:返回 -1
*/

 4.3 fcntl

int n = fcntl(fd, F_DUPFD, 18)

 

标签:文件,const,函数,int,char,描述符,Linux,include,目录
From: https://www.cnblogs.com/stux/p/17792803.html

相关文章

  • linux解压缩,复制,重命名,删除,目录按更新时间排序,grep递归搜索文档
    linux解压缩,复制,重命名,删除,目录按更新时间排序,grep递归搜索文档1.解压缩压缩命令zip-p-rmymail-1026.zipmymail/解压命令unzipmymail-1026.zip2.复制将文件file1复制到dir1目录下的file2文件cpfile1dir1/file2将文件夹source_dir复制到target_dir目前并且修改......
  • redshift DATE_TRUNC函数 查询日期上个月的26号到当前月的26号
    redshiftDATE_TRUNC函数查询日期上个月的26号到当前月的26号#redshift脚本#2023-08-0100:00:00.000selectDATE_TRUNC('month',current_date-INTERVAL'2month')#2023-08selectleft(DATE_TRUNC('month',current_date-INTERVAL'2month......
  • Linux内核中的两种ID分配方式
    参考https://www.kernel.org/doc/html/latest/core-api/idr.html正文在写内核代码时,可能会需要给数据结构分配一个唯一的ID的需求,具体是下面两种需求:给结构体A分配一个全局唯一的ID,但是不需要根据ID找到结构体A的地址的用法不但需要给结构体A分配一个全局唯一的ID,而且还......
  • Linux lp命令(-o选项,-d目标打印机,-p页码范围)
     原文主要介绍lp命令的参数和描述。常见命令包括:lpfilename(打印filename)-d打印机名称(指定打印机)-P1,2-5,6(指定页码范围)-osides=two-sided-long-edge(选项,长边翻转,竖直打印)-onumber-up(指定一页几版)……有趣的打印命令详见下文lp命令原文:通过命令行,manlp得到:NAME......
  • Linux mkdir命令:创建目录(文件夹)
    mkdir命令,是makedirectories的缩写,用于创建新目录,此命令所有用户都可以使用。mkdir命令的基本格式为:[root@localhost~]#mkdir[-mp]目录名-m选项用于手动配置所创建目录的权限,而不再使用默认权限。-p选项递归创建所有目录,以创建/home/test/demo为例,在默认情况下,你需要......
  • Python根据列表在指定目录寻找对应前缀的文件
    现在有一个txt列表,里面包含的是一些文件名,如a,b等等,现在需求是在一个多级文件夹下,需要寻找以a为名字的任何格式文件,如a.001,a.002等等,寻找这个txt列表里包含的文件名的对应文件,复制到指定文件夹下importosimportshutil#读取文件名列表withopen('msg.txt','r')asfile:......
  • 无涯教程-Clojure - re-pattern函数
    re-pattern返回java.util.regex.Pattern的实例。然后将其用于其他模式匹配方法。re-pattern-语法(repatternpat)参数   - "pat"是需要形成的pattern。返回值 - 类型为java.util.regex.Pattern的模式对象。re-pattern-示例(nsclojure.examples.example......
  • Linux p11 时间日期指令
    【学习课程】:【【小白入门通俗易懂】2021韩顺平一周学会Linux】https://www.bilibili.com/video/BV1Sv411r7vd/?p=14&share_source=copy_web&vd_source=2c07d62293f5003c919b2df9b2e0549e时间日期指令date指令显示当前日期基本语法:date,显示当前时间date+%Y,显示当前......
  • linux 如何开机的时候自动挂载硬盘
    编辑/etc/fstab文件该文件的主要作用是在系统启动时自动挂载文件系统。当系统启动时,Linux会读取/etc/fstab文件中的信息,并根据其中的配置将指定的文件系统挂载到指定的挂载点上sudovim/etc/fstab#示例/dev/sdb1/mnt/dataext4defaults00#我的/dev/sda/media/ka......
  • 无涯教程-Clojure - take-last函数
    从序列中获取元素的最后一个列表。take-last-语法以下是语法。(take-lastnumseq1)参数   - "seq1"是元素的顺序列表。"num"是从最后开始需要包含在序列中的元素数。返回值 - 一个新的元素序列,其中仅包含元素的结束数。take-last-示例(nsclojure.exa......