嵌入式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 */
};
d_type符号含义
1p有名管道文件
2c字符设备文件
4d目录文件
6b块设备文件
8-普通文件
10l链接文件
12s套接字文件

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

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

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

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

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

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;
}

运行结果

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在嵌入式Linux上使用boa和cgi来浏览文件目录,您需要按照以下步骤进行操作: 1. 安装boa和cgi: 在Linux中,您可以使用以下命令来安装boa和cgi: ``` sudo apt-get install boa sudo apt-get install libcgi-pm-perl ``` 2. 配置boa服务器: 在嵌入式Linux上,您需要编辑boa服务器的配置文件,以便它可以正确地运行cgi脚本。默认情况下,boa服务器配置文件位于/etc/boa/boa.conf。您需要确保以下配置项已启用: ``` server.modules = ("mod_cgi") ``` 并且以下行被注释掉: ``` #cgi.assign = ( ".cgi" => "/usr/bin/perl" ) ``` 3. 创建cgi脚本: 您可以使用Perl或其他脚本语言来编写cgi脚本,以便在boa服务器上运行。以下是一个示例Perl脚本,它将显示当前目录中的所有文件和子目录: ``` #!/usr/bin/perl use CGI qw(:standard); print header, start_html('File Browser'), h1('File Browser'), "<ul>\n"; opendir(DIR, "."); while ($file = readdir(DIR)) { next if ($file =~ m/^\./); if (-d $file) { print "<li><a href=\"$file/\">$file/</a></li>\n"; } else { print "<li><a href=\"$file\">$file</a></li>\n"; } } closedir(DIR); print "</ul>\n", end_html; ``` 4. 将cgi脚本复制到boa服务器的cgi-bin目录中: 默认情况下,boa服务器的cgi-bin目录位于/var/www/cgi-bin。将您的cgi脚本复制到此目录中。 5. 启动boa服务器: 您可以使用以下命令启动boa服务器: ``` sudo /etc/init.d/boa start ``` 现在,您可以在浏览器中输入嵌入式Linux的IP地址和端口号(默认为8888),然后浏览您的文件目录。例如,如果您的嵌入式Linux的IP地址为192.168.1.100,则可以在浏览器中输入http://192.168.1.100:8888/cgi-bin/your-script.cgi来运行您的cgi脚本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值