嵌入式Linux文件IO,目录操作opendir(),readdir(),closedir(),chmode(),fchmode(),stat(),lstat(),fstat()
文章目录
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;
}
运行结果