zoukankan      html  css  js  c++  java
  • 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
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    Intersection
    B-number
    Intersecting Lines
    Segments
    G. Swapping Places
    Toy Storage
    TOYS
    哈密顿绕行世界问题
    java试题复盘——11月25日
    java试题复盘——11月13日
  • 原文地址:https://www.cnblogs.com/ch122633/p/8157707.html
Copyright © 2011-2022 走看看