嵌入式Linux文件IO,目录操作opendir(),readdir(),closedir(),chmode(),fchmode(),stat(),lstat(),fstat()

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

扫描二维码关注公众号,回复: 3928965 查看本文章
带参数的宏定义 描述
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;
}

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37542524/article/details/83692864