apue 第4章 文件和目录

获取文件属性

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *pathname, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *pathname, struct stat *buf);

#include <fcntl.h>
#include <sys/stat.h>

int fstatat(int dirfd, const char *pathname, struct stat *buf, int flags);返回值:成功0,出错-1

stat结构:

struct stat {
  dev_t     st_dev;         /* ID of device containing file */
  ino_t     st_ino;         /* inode number */
  mode_t    st_mode;        /* protection */
  nlink_t   st_nlink;       /* number of hard links */
  uid_t     st_uid;         /* user ID of owner */
  gid_t     st_gid;         /* group ID of owner */
  dev_t     st_rdev;        /* device ID (if special file) */
  off_t     st_size;        /* total size, in bytes */
  blksize_t st_blksize;     /* blocksize for filesystem I/O */
  blkcnt_t  st_blocks;      /* number of 512B blocks allocated */

  /* Since Linux 2.6, the kernel supports nanosecond
    precision for the following timestamp fields.
    For the details before Linux 2.6, see NOTES. */
  struct timespec st_atim;  /* time of last access */
  struct timespec st_mtim;  /* time of last modification */
  struct timespec st_ctim;  /* time of last status change */

  #define st_atime st_atim.tv_sec      /* Backward compatibility */
  #define st_mtime st_mtim.tv_sec
  #define st_ctime st_ctim.tv_sec
};

按实际用户ID和实际组ID进行访问权限测试

#include <unistd.h>

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

#include <fcntl.h>
#include <unistd.h>

int faccessat(int dirfd, const char *pathname, int mode, int flags);返回值:成功0,出错-1

为进程设置文件模式创建屏蔽字

#include <sys/types.h>
#include <sys/stat.h>

mode_t umask(mode_t mask);
返回值:之前文件模式创建屏蔽字

更改现有文件的访问权限

#include <sys/stat.h>

int chmod(const char *pathname, mode_t mode);
int fchmod(int fd, mode_t mode);

#include <fcntl.h>
#inlcude <sys/stat.h>

int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags);返回值:成功0,出错-1

用于改变文件的用户ID和组ID。如果两个参数owner或group中的任意一个是-1,则对应ID不变

#include <unistd.h>

int chown(const char *pathname, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *pathname, uid_t owner, gid_t group);

#include <fcntl.h>           /* Definition of AT_* constants */
#include <unistd.h>

int fchownat(int dirfd, const char *pathname, uid_t owner, gid_t group, int flags);返回值:成功0,出错-1

截断文件

#include <unistd.h>
#include <sys/types.h>

int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
返回值:成功0,出错-1

创建一个指向现有文件的链接

#include <unistd.h>

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

#include <fcntl.h>           /* Definition of AT_* constants */
#include <unistd.h>

int linkat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, int flags);
返回值:成功0,出错-1

删除一个现有目录项

#include <unistd.h>

int unlink(const char *pathname);

#include <fcntl.h>
#include <unistd.h>

int unlinkat(int dirfd, const char *pathname, int flags);返回值:成功0,出错-1

解除对一个文件或目录的链接

#include <stdio.h>

int remove(const char *pathname);
返回值:成功0,出错-1

对文件或目录进行重命名

#include <stdio.h>

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

#include <fcntl.h>
#include <stdio.h>

int renameat(int olddirfd, const char *oldpath, int newdirfd, const char *newpath);
int renameat2(int olddirfd, const char *oldpath, int newdirfd, const char *newpath, unsigned int flags);
返回值:成功0,出错-1

创建一个符号链接

#include <unistd.h>

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

#include <fcntl.h>
#include <unistd.h>

int symlinkat(const char *target, int newdirfd, const char *linkpath);
返回值:成功0,出错-1

因为open函数跟随符号链接,所以需要一种方法打开链接本身,并读该链接中的名字。

#include <unistd.h>

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

#include <fcntl.h>           /* Definition of AT_* constants */
#include <unistd.h>

ssize_t readlinkat(int dirfd, const char *pathname, char *buf, size_t bufsiz);
返回值:成功读取字节数,出错-1

一个文件的访问和修改时间可以用以下几个函数更改。futimens和utimensat函数可以指定纳秒级精度的时间戳。

用到数据结构是与stat函数族相同的timespec结构。

#include <fcntl.h> /* Definition of AT_* constants */
#include <sys/stat.h>

int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags);

int futimens(int fd, const struct timespec times[2]);
返回值:成功0,出错-1

创建目录,删除目录

#include <sys/stat.h>
#include <sys/types.h>

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

#include <fcntl.h>           /* Definition of AT_* constants */
#include <sys/stat.h>

int mkdirat(int dirfd, const char *pathname, mode_t mode);返回值:成功0,出错-1

删除一个空目录,空目录只包含.和..

#include <unistd.h>

int rmdir(const char *pathname);
返回值:成功0,出错-1

读目录

#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name);
DIR *fdopendir(int fd);返回值:成功指针,出错NULL
struct dirent *readdir(DIR *dirp);返回值:成功指针,若在目录或出错,返回NULL
void rewinddir(DIR *dirp);
int closedir(DIR *dirp);返回值:成功0,出错-1
long telldir(DIR *dirp);返回值:dp关联的目录中的当前位置
void seekdir(DIR *dirp, long loc);

dirent结构

struct dirent {
    ino_t          d_ino;       /* inode number */
    off_t          d_off;       /* not an offset; see NOTES */
    unsigned short d_reclen;    /* length of this record */
    unsigned char  d_type;      /* type of file; not supported
                                   by all filesystem types */
    char           d_name[256]; /* filename */
};

更改当前目录

#include <unistd.h>

int chdir(const char *path);
int fchdri(int fd);返回值:成功0,出错-1

得到当前工作目录完整绝对路径名

#include <unistd.h>

char *getcwd(char *buf, size_t size);
返回值:成功返回buf,出错NULL

原文地址:https://www.cnblogs.com/ch122633/p/8157707.html

时间: 2024-10-12 01:39:55

apue 第4章 文件和目录的相关文章

apue第四章 文件和目录

函数stat,fstat,fstatat, lstat #include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict buf); int fstat(int fd, struct stat *buf); int lstat(const char *restrict pathname, struct stat *restrict buf); int lstat(int fd, const c

APUE学习笔记:第四章 文件和目录

4.1 引言 本章将描述文件的特征和文件的性质 4.2 stat.fstat和lstat函数 #include<sys/stat.h> int stat(const char *restrict pathname,struct stat *restrict buf); int fstat(int filedes,struct stat *buf) int lstat(const char *restrict pathname,struct stat *restrict buf); 三个函数的返

APUE读书笔记-第四章 文件和目录

到第四章了,不知什么时候才能把这本书看完,耽误的时间太多了. 第四章是在第三章的基础上,主要描述文件系统的其他性质和文件的性质. 4.2 stat.fstat.fstatat.lstat函数 首先来看看这四个函数的原型: #include <sys/stat.h> ///usr/include/x86_64-linux-gnu/sys/ int stat (const char *__restrict __file, struct stat *__restrict __buf) int fst

APUE(4)---文件和目录 (2)

umask函数为进程设置文件模式创建屏蔽字,并返回之前的值,这是少数几个没有出错返回函数中的一个.其中cmask是9个常量(S_IR/W/XUSR.S_IR/W/XGRP.S_IR/W/XOTH)中的若干个按位“或”构成的. #include<sys/stat.h> mode_t umask(mode_t cmask); //返回值:之前的文件模式创建屏蔽字 #include<apue.h> #include<fcntl.h> #define RWRWRW (S_IRU

APUE(4)---文件和目录 (3)

十三.函数rename和renameat #include <stdio.h> int rename(const char *oldname, const char *newname); int renameat(int oldfd, const char *oldname, int newfd, const char *newname); 文件或目录可以用rename函数或者renameat函数进行重命名.有几种情况需要说明: 1.如果oldname指的是一个文件而不是目录,那么为该文件或符

第四章 文件和目录

本章主要介绍文件目录的创建.删除.读写.设置访问权限以及获取文件或目录的属性等: 唯一需要强调的可能就是:目录也是一种文件 获取文件目录的属性 关键函数 stat/fstat/lstat用于获取文件的信息,如文件的所有者,权限,修改和访问时间等等 #include <sys/stat.h> int fstat(int fildes, struct stat *buf); // 获取已打开的文件的相关信息 int fstat64(int fildes, struct stat64 *buf);

【Linux系列】【基础版】第二章 文件、目录管理

2. 文件.目录管理     2.1 有哪些文件目录         2.1.1 /bin          2.1.2 /boot         2.1.3 /dev         2.1.4 /etc         2.1.5 /home         2.1.6 /lib  /lib64         2.1.7 /meida         2.1.8 /mnt         2.1.9 /opt         2.1.10 /proc         2.1.11 /ru

第4章 文件和目录(3)_文件系统结构及软、硬链接

3. Linux文件系统结构 3.1 文件系统结构 (1)超级块 文件系统中的第一个块被称为超级块.这个块存放文件系统本身的信息.比如,记录了每个区域的大小,也存放了未被使用的磁盘块的信息.其包含的信息如下: 主要域 含义 Magic Number 用来检验是否是一个真正的EXT2文件系统超级块 Revision Level 主从修订版本号.让安装代码据此判断文件系统是否支持只存在于某个特定版本文件系统中的属性. Block Group Number 超级块的组数量 Block Size 以字节

《python编程》第四章——文件和目录工具

1.文件和目录,他们本身就是我们在电脑里看到的那些一个个文件.目录在windows中就是文件夹,很好理解. 2.我们用到的大多数用途,就是利用open内建函数及其文件对象来处理文件. 3.open函数返回的文件对象有多种方法,read,readline,readlines,write,writelines,close,seek,flush(将缓存区的数据强制转移到磁盘),fileno(获取底层的文件句柄)等. 4.打开一个文件的整个步骤都是分为三步的,1.打开,同时指定打开来做什么用(比如wri