读取目录内容
应用程序可以用readdir系列函数来读取目录内容。
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name); //成功返回目录指针,失败返回NULL
struct dirent *readdir(DIR *dirp); //成功返回目录项指针,已读完或失败返回NULL
int closedir(DIR *dirp); //成功返回0,错误返回-1.
每次对readdir的调用返回的都是指向下一个目录项的指针,如果没有更多的目录项则返回NULL。每个目录项都是一个结构,形式如下:
struct dirent{
ino_t d_ino; //inode值
char d_name[256]; //文件名
}
如果出错,readdir也是返回NULL,但是它同时会设置errno。所以这时唯一区分错误还是流结束的线索,我们需要在程序中检查errno在readdir调用前后是否变化来检查有没有错误。
int main(int argc, char **argv)
{
DIR *streamp;
struct dirent *dep;
if(!(streamp = opendir(argv[1])))
exit(-1);
errno = 0;
while((dep = readdir(streamp)) != NULL){
printf("Found file:%s
", dep->d_name);
}
if(errno != 0)
exit(-2);
if(closedir(streamp))
exit(-3);
exit(0);
}
读取文件元数据
应用程序能够调用stat及fstat函数,检索到文件信息(或称为文件元数据)。
#include <unistd.h>
#include <sys/stat.h>
int stat(const char *filename, struct stat *buf);
int fstat(int fd, struct stat *buf);
//成功返回0,出错返回-1
下图列出结构体stat的详细成员:
struct stat {
dev_t st_dev; //设备
ino_t st_ino; // inode
mode_t st_mode; //文件权限信息
nlink_t st_nlink; //硬连接数
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //设备类型(如果是节点设备的话)
off_t st_size; //文件大小(字节)
unsignedlong st_blksize; //块大小
unsignedlong st_blocks; //块数目
time_t st_atime; //文件最后访问时间
time_t st_mtime; //文件最后修改时间
time_t st_ctime; //文件最后变动时间
};
linux系统在stat.h中定义了宏谓词来确定st_mode成员的文件类型:
- S_ISREG(m) :这是一个普通文件吗?
- S_ISDIR(m) :这是一个目录文件吗?
- S_ISSOCK(m) :这是一个网络套接字吗?
下面一个查询和处理一个文件st_mode位的示例:
int main (int argc, char **argv)
{
struct stat stat;
char *type, *readok;
if (argc != 2) {
fprintf(stderr, "usage: %s <filename>
", argv[0]);
exit(0);
}
Stat(argv[1], &stat);
if (S_ISREG(stat.st_mode)) /* Determine file type */
type = "regular";
else if (S_ISDIR(stat.st_mode))
type = "directory";
else
type = "other";
if ((stat.st_mode & S_IRUSR)) /* Check read access */
readok = "yes";
else
readok = "no";
printf("type: %s, read: %s
", type, readok);
exit(0);
}
获取更多知识,请点击关注:
嵌入式Linux&ARM
CSDN博客
简书博客