嵌入式Linux文件IO,目录操作opendir(),readdir(),closedir()文件权限chmode(),fchmode(),文件属性stat()/lstat()/fstat()文件类型
文章目录
- 1,访问目录,opendir(),返回目录流指针
- 2,访问目录,readdir(),返回目录项指针
- 3,访问目录,closedir()
- 访问目录示例opendir(),readdir(),closedir()
- 读取目录运行结果
1,访问目录,opendir(),返回目录流指针
opendir函数用来打开一个目录文件:
#include <dirent.h>
DIR *opendir(const char *name);
- DIR是用来描述一个打开的目录文件的结构体类型
- 成功时返回目录流指针; 出错时返回NULL
2,访问目录,readdir(),返回目录项指针
readdir函数用来读取目录流中的内容:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
- struct dirent是用来描述目录流中一个目录项的结构体类型
- 包含成员char d_name[256] 参考帮助文档
- 成功时返回目录流dirp中下一个目录项;
- 出错或到末尾时时返回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);
- 成功时返回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);
- 成功时返回0; 出错时返回EOF
- 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);
- 成功时返回0; 出错时返回EOF
- 如果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; }
运行结果
阅读更多
- linux 目录操作函数opendir readdir closedir,文件stat
- Linux下目录文件的操作(opendir,readdir,closedir) 以及DIR,dirent,stat等结构体详解
- Linux C/C++ ----目录文件的操作(opendir,readdir,closedir)
- Linux 文件操作函数 opendir()、readdir()、closedir()、stat()
- 08-Linux基础入门(六)-文件和目录的属性及权限之文件类型及文件扩展名
- 文件操作opendir()/readdir()/closedir()/stat()
- linux c下目录文件的操作(opendir,readdir,closedir)
- 08-Linux基础入门(六)-文件和目录的属性及权限之文件类型及文件扩展名
- unix文件和目录操作的函数stat()、fstat()、lstat()、access()、umask()函数
- 文件操作opendir()/readdir()/closedir()/stat()
- opendir、readdir和closedir(PHP操作目录和文件)
- 文件操作opendir()/readdir()/closedir()/stat() .
- linux目录相关函数opendir、readdir、rewinddir、closedir、telldir、seekdir、stat函数和DIR、dirent、stat结构体详解
- Linux 获取文件属性 函数 stat, fstat, lstat 以及 stat 结构体
- linux c学习笔记----目录文件的操作(opendir,readdir,closedir)
- 【Linux学习笔记】获取文件属性 — stat()、fstat()、lstat()小结
- 【Linux学习笔记】获取文件属性 — stat()、fstat()、lstat()小结
- Linux文件和目录的操作(十) 查看属性 stat
- 【Linux学习笔记】获取文件属性 — stat()、fstat()、lstat()小结
- Linux获取文件属性stat()、fstat()、lstat()函数实例学习