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
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    Object-C,NSSet,不可变集合
    NYIST 860 又见01背包
    NYIST 1070 诡异的电梯【Ⅰ】
    HDU 1542 Atlantis
    HDU 4756 Install Air Conditioning
    CodeForces 362E Petya and Pipes
    HDU 4751 Divide Groups
    HDU 3081 Marriage Match II
    UVA 11404 Palindromic Subsequence
    UVALIVE 4256 Salesmen
  • 原文地址:https://www.cnblogs.com/ch122633/p/8157707.html
Copyright © 2011-2022 走看看