【Linux文件相关操作】

1.文件同步

1、在写入数据时,内存到磁盘之间有一块缓冲区,这种机制降低了磁盘读写次数,提高了读写效率
2、但是这种机制带来的后果是磁盘的数据与实际写入的数据不匹配,系统提供了三个系统函数可以让缓冲区的数据立即写入

void sync(void);
功能:立即把缓冲区中的数据同步到磁盘
注意:并不会等待数据同步结束才返回,而是提交要同步的数据到写入队列中

int fsync(int fd);
功能:把指定文件的内容同步到磁盘
注意:会等到完全写入磁盘后才返回

int fdatasync(int fd);
功能:把指定文件的内容同步到磁盘,只是同步文件内容不同步属性

2.文件属性

int stat(const char *pathname, struct stat *buf);
功能:根据文件的路径获取文件属性
buf:存储文件属性的结构体 是一个输出型参数

int fstat(int fd, struct stat *buf);
功能:根据文件描述获取文件属性

int lstat(const char *pathname, struct stat *buf);
功能:根据文件的路径获取软链接文件属性

    struct stat {
           dev_t     st_dev;         /* 设备ID */
           ino_t     st_ino;         /* inode节点号*/
           mode_t    st_mode;        /* 文件类型和权限 */
           nlink_t   st_nlink;       /* 硬链接数 */
           uid_t     st_uid;         /* 用户ID*/
           gid_t     st_gid;         /* 组ID */
           dev_t     st_rdev;        /* 特殊设备ID */
           off_t     st_size;        /* 文件总字节数*/
           blksize_t st_blksize;     /* IO块字节数 */
           blkcnt_t  st_blocks;      /* 占用512Bblock块数量 */
           struct timespec st_atim;  /* 最后访问时间 */
           struct timespec st_mtim;  /* 最后修改时间 */
           struct timespec st_ctim;  /* 最后状态修改时间 */
 
 st_mode:
    文件类型:    
       S_IFMT     0170000   获取文件类型的掩码
       S_IFSOCK   0140000   socket文件
       S_IFLNK    0120000   软链接文件
       S_IFREG    0100000   普通文件
       S_IFBLK    0060000   块设备文件
       S_IFDIR    0040000   目录文件
       S_IFCHR    0020000   字符设备文件
       S_IFIFO    0010000   管道文件
    上面类型判断在POSIX中定义了以下函数进行类型判断
       S_ISREG(st_mode)  是普通文件
       S_ISDIR(m)  是目录文件
       S_ISCHR(m)  字符设备文件
       S_ISBLK(m)   块设备文件
       S_ISFIFO(m) 管道文件
       S_ISLNK(m)  软链接文件
       S_ISSOCK(m)  socket文件

3.文件的权限

1.int access(const char *pathname, int mode);

功能:测试当前用户对文件的权限
pathname:文件的路径
mode:想要测试的权限
    F_OK   文件是否存在
    R_OK    读权限
    W_OK    写权限
    X_OK    执行权限

返回值:存在返回0,不存在返回-1

2. int chmod(const char *pathname,mode_t mode);

功能:根据路径修改文件权限
mode:由三位八进制数组成的权限码
 0644  普通文件 
 0755  目录文件/可执行文件

3. int fchmode(int fd,mode_t mode);

功能:根据文件描述符修改文件权限       

4.权限屏蔽码

如果我们不想让新创建的文件拥有某种权限,则可以设置权限过滤,记录在权限屏蔽码中
权限屏蔽码对chmod命令和函数是无效的
通过命令 umask 查看当前终端的权限屏蔽码
1、通过 umask 0xxx 设置当前终端的权限屏蔽码
2、函数修改
mode_t umask(mode_t mask);
mask:想要设置的权限屏蔽码
返回值:旧的权限屏蔽码

注意:通过命令、函数修改权限屏蔽码,只会在当前终端生效,如果关闭后会恢复为默认的

5.修改文件的大小

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

功能:根据文件路径修改文件长度
length:想要修改的字节数

2.int ftruncate(int fd, off_t length);

功能:根据文件描述符修改文件长度
length:想要修改的字节数

6.文件删除和重命名

1.int remove(const char *pathname);

功能:标准库中的删除文件、空目录的函数
        底层调用了unlink

2.int unlink(const char *pathname);

功能:删除文件

3. int rename(const char *oldpath, const char *newpath);

功能:重命名、移动文件

7.链接文件

1.Linux文件系统会有两个主要的分区:

    inode信息块:默认128B,记录文件权限、大小、所有者、修改时间
    block数据块:默认4k,记录了文件名和数据信息
    每个文件必须拥有唯一一个inode以及若干个block块,读写文件需要借助目录的block中记录的文件名和inode号找到该文件的inode,
    通过inode读取block

2.什么是软硬链接文件?

1.硬链接:硬链接文件没有自己的inode和block,只是在不同目录下复制了一份源文件的inode信息,通过inode信息访问源文件的block。

2.软链接:软链接会建立自己的新的inode和block,软链接的block存储的是源文件的inode信息

3.区别:

        1、删除源文件,只是删除了源文件的inode信息,硬链接不受影响,而软链接无法访问
        2、对于一个文件而言,硬链接数删除为0时,文件才被真正的删除
        3、当修改硬链接文件的内容,源文件也会被修改
        4、硬链接不能链接目录,软链接可以
        5、硬链接不能跨文件系统、软链接可以

3int link(const char *oldpath, const char *newpath);

        功能:创建硬链接文件

4. int symlink(const char *target, const char *linkpath);

        功能:创建软链接文件

5.ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);

        功能:读取软链接文件链接路径

8.目录操作

1.int mkdir(const char *pathname, mode_t mode);

功能:创建目录
mode:权限,必须要有执行权限才能访问目录

2.int rmdir(const char *pathname);

功能:删除空目录

3.char *getcwd(char *buf, size_t size);

功能:获取当前工作目录,相当于pwd
buf:存储结果的内存
size:buf的大小
返回值:buf的地址   方便链式调用

4.DIR *opendir(const char *name);

功能:打开目录文件,返回目录流结构体指针

5.DIR *fdopendir(int fd);

功能:打开目录文件,返回目录流结构体指针

6.struct dirent *readdir(DIR *dirp)

功能:从目录流中读取一条记录信息,该条信息记录了目录中一个文件的信息
 struct dirent {
           ino_t          d_ino;       /* inode号*/
           off_t          d_off;       /* 下一条信息的偏移量*/
           unsigned short d_reclen;    /* 当前信息的长度 */
           unsigned char  d_type;      /* 文件的类型*/
           char           d_name[256]; /* 文件名 */
       };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值