您的位置:首页 > 运维架构 > Linux

嵌入式Linux文件IO,目录操作opendir(),readdir(),closedir()文件权限chmode(),fchmode(),文件属性stat()/lstat()/fstat()文件类型

2018-11-04 01:00 399 查看

文章目录

  • 4,修改文件访问权限chmod(),fchmod()
  • 5,获取文件属性stat(),lstat(),fstat()
  • 6,文件属性,结构体:struct stat
  • 7,文件类型,struct stat成员st_mode
  • 8,文件访问权限st_mode
  • 1,访问目录,opendir(),返回目录流指针

    opendir函数用来打开一个目录文件:
    #include <dirent.h>
    DIR *opendir(const char *name);

    1. DIR是用来描述一个打开的目录文件的结构体类型
    2. 成功时返回目录流指针; 出错时返回NULL

    2,访问目录,readdir(),返回目录项指针

    readdir函数用来读取目录流中的内容:
    #include <dirent.h>
    struct dirent *readdir(DIR *dirp);

    1. struct dirent是用来描述目录流中一个目录项的结构体类型
    2. 包含成员char d_name[256] 参考帮助文档
    3. 成功时返回目录流dirp中下一个目录项;
    4. 出错或到末尾时时返回NULL
    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 */
    };

    3,访问目录,closedir()

    closedir函数用来关闭一个目录文件:
    #include <dirent.h>
    int closedir(DIR *dirp);

    1. 成功时返回0; 出错时返回EOF

    访问目录示例opendir(),readdir(),closedir()

    #include <stdio.h>
    #include <dirent.h>
    
    int read_directory(const char *file);
    int main(int argc, const char *argv[])
    {
    if(argc < 2)
    {
    printf("ussage:%s <file name or path>\n",argv[0]);
    return -1;
    }
    
    read_directory(argv[1]);
    return 0;
    }
    
    int read_directory(const char *file)
    {
    DIR *dirp;//定义目录流指针
    struct dirent *dp;//定义目录项指针
    if((dirp = opendir(file)) == NULL)
    {
    perror("opendir");
    return -1;
    }
    while ((dp = readdir(dirp)) != NULL)
    {
    printf("%s\n",dp->d_name);
    }
    closedir(dirp);
    
    return 0;
    }

    读取目录运行结果

    4,修改文件访问权限chmod(),fchmod()

    chmod/fchmod函数用来修改文件的访问权限:
    #include <sys/stat.h>
    int chmod(const char *path, mode_t mode);
    int fchmod(int fd, mode_t mode);

    1. 成功时返回0; 出错时返回EOF
    2. root和文件所有者能修改文件的访问权限

    修改文件访问权限示例

    chmod(“test.txt”, 0666);

    5,获取文件属性stat(),lstat(),fstat()

    stat/lstat/fstat函数用来获取文件属性:
    #include <sys/stat.h>
    int stat(const char *path, struct stat *buf);
    int lstat(const char *path, struct stat *buf);
    int fstat(int fd, struct stat *buf);

    1. 成功时返回0; 出错时返回EOF
    2. 如果path是符号链接stat获取的是目标文件的属性; 而lstat获取的是链接文件的属性

    6,文件属性,结构体:struct stat

    struct stat是存放文件属性的结构体类型:

    成员 描述
    mode_t st_mode; 类型和访问权限
    uid_t st_uid; 所有者id
    uid_t st_gid; 用户组id
    off_t st_size; 文件大小
    time_t st_mtime; 最后修改时间

    文件属性示例分析

    以下面格式打印指定文件的主要信息:
    $ ./a.out test.c
    -rw-r–r-- 317 2014-11-08 test.c

    - r w - r - - r - - 317 2014-11-08
    文件类型 管理员权限 组用户权限 其他用户权限 文件大小 最后修改时间

    7,文件类型,struct stat成员st_mode

    通过系统提供的宏来判断文件类型:
    st_mode & 0170000

    带参数的宏定义 描述
    S_ISREG(st_mode) 0100000 是普通文件,返回true -
    S_ISDIR(st_mode) 0040000 是目录文件,返回true d
    S_ISCHR(st_mode) 0020000 是字符设备文件,返回true c
    S_ISBLK(st_mode) 0060000 是块设备文件,返回true b
    S_ISFIFO(st_mode) 0010000 是有名管道文件,返回true p
    S_ISLNK(st_mode) 0120000 是链接文件,返回true l
    S_ISSOCK(st_mode) 0140000 是套接字文件,返回true s

    8,文件访问权限st_mode

    通过系统提供的宏来获取文件访问权限:
    Ø S_IRUSR 00400 bit:8
    Ø S_IWUSR 00200 7
    Ø S_IXUSR 00100 6
    Ø S_IRGRP 00040 5
    Ø S_IWGRP 00020 4
    Ø S_IXGRP 00010 3
    Ø S_IROTH 00004 2
    Ø S_IWOTH 00002 1
    Ø S_IXOTH 00001 0

    获取文件属性示例lstat(),struct stat,文件类型,操作权限

    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    #include <dirent.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <time.h>
    
    int my_ll(const char *file);
    int main(int argc, const char *argv[])
    {
    if(argc < 2)
    {
    printf("ussage:%s <file name or path>\n",argv[0]);
    return -1;
    }
    
    my_ll(argv[1]);
    return 0;
    }
    
    int my_ll(const char *file)
    {
    int i = 0;
    struct tm *tp;
    struct stat buf;
    
    if((lstat(file,&buf)) <0)
    {
    fprintf(stdout,"lstat %s :%s\n",file,strerror(errno));
    return -1;
    }
    switch (buf.st_mode & S_IFMT)//获取文件类型
    {
    case S_IFREG:
    printf("-");
    break;
    case S_IFDIR:
    printf("d");
    break;
    case S_IFCHR:
    printf("c");
    break;
    case S_IFBLK:
    printf("b");
    break;
    case S_IFIFO:
    printf("p");
    break;
    case S_IFLNK:
    printf("l");
    break;
    case S_IFSOCK:
    printf("s");
    break;
    }
    for(i=8;i>=0;i--)//获取操作权限
    {
    if(buf.st_mode & (1<<i))
    {
    switch (i % 3)
    {
    case 2:
    printf("r");
    break;
    case 1:
    printf("w");
    break;
    case 0:
    printf("x");
    break;
    }
    }
    else
    {
    printf("-");
    }
    }
    
    printf(" %lu",buf.st_size);//获取文件大小
    
    tp = localtime(&(buf.st_mtime));//获取最后修改时间
    printf(" %d-%02d-%02d",tp->tm_year+1900,tp->tm_mon+1,tp->tm_mday);
    printf(" %02d:%02d:%02d",tp->tm_hour,tp->tm_min,tp->tm_sec);
    printf(" %s\n",file);//获取文件名
    return 0;
    }

    运行结果

    阅读更多
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: 
    相关文章推荐