admin管理员组

文章数量:1516870

1.linux中各种文件类型

普通文件:

(1) 文本文件: 由文本构成,常见的.c文件, .h文件 .txt文件等都是文本文件,文本文件的好处就是可以被人轻松读懂和编写。

(2) 二进制文件: 常见的可执行程序文件(gcc编译生成的a.out,arm-linux-gcc编译连接生的.bin)都是二进制文件。

字符设备文件,块设备文件,管道文件,套接字文件,符号链接文件。


2.常用文件属性获取

(1) 文件属性信息查看的API有三个 stat、fstat、lstat ,三个作用一样,参数不同,细节略有不同。

(2)linux命令行下还可以去用 stat命令 去查看文件属性信息,实际上stat命令内部就是使用stat系统调用来实现的。

(3)stat这个API的作用就是 让内核将我们要查找属性的文件的属性信息结构体的值放入我们传递给stat函数的buf中 当stat这个API调用从内核返回的时候buf中就被填充了文件的正确的属性信息,然后我们通过查看buf这种结构体变量的元素就可以得知这个文件的各种属性了。

(4) struct stat结构体简介

(5) 写个程序来查看一些常见属性信息

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define NAME "1.txt"
int main(void)
{
	int ret = -1;
	struct stat buf;
	
	memset(&buf, 0, sizeof(buf));		// memset后buf中全是0
	ret = stat(NAME, &buf);				// stat后buf中有内容了
	if (ret < 0)
	{
		perror("stat");
		exit(-1);
	}
	// 成功获取了stat结构体,从中可以得到各种属性信息了
	printf("inode = %d.\n", buf.st_ino);
	printf("size = %d bytes.\n", buf.st_size);
	printf("st_blksize = %d.\n", buf.st_blksize);
	
	return 0;
}

(6) 判断文件类型

S_ISREG宏返回值是1表示这个文件是一个普通文件 ,如果文件不是普通文件则返回值是0.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define NAME "1.txt"
int main(void)
{
	int ret = -1;
	struct stat buf;
	
	memset(&buf, 0, sizeof(buf));		// memset后buf中全是0
	ret = stat(NAME, &buf);				// stat后buf中有内容了
	if (ret < 0)
	{
		perror("stat");
		exit(-1);
	}	
	// 判断这个文件属性
	//int result = S_ISREG(buf.st_mode);        //判断是否为普通文件,是则返回1,不是返回0
	int result = S_ISDIR(buf.st_mode);           //判断是否为目录文件,是则返回1,不是返回0
	printf("result = %d\n", result);
	return 0;
}


3.文件权限管理

1) st_mode本质上是一个32位的数 (类型就是unsinged int),这个数里的每一个位表示一个含义, 用的时候使用专门的掩码去取出相应的位即可得知相应的信息。

ls -l打印出的权限列表:

(2)123456789一共9位,3个一组。 第一组三个表示文件的属主 (owner、user)对该文件的可读、可写、可执行权限; 第2组3个位表示文件的属主所在的组 (group)对该文件的权限; 第3组3个位表示其他用户 (others)对该文件的权限。

(3)chmod是一个linux命令, 用来修改文件的各种权限属性 chmod命令只有root用户才有权利去执行修改, chmod命令其实内部是用linux的一个叫chmod的API实现的。

-rw------- (600) – 只有属主有读写权限。
-rw-r–r-- (644) – 只有属主有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700) – 只有属主有读、写、执行权限。
-rwxr-xr-x (755) – 属主有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx–x–x (711) – 属主有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666) – 所有用户都有文件读、写权限。这种做法不可取。
-rwxrwxrwx (777) – 所有用户都有读、写、执行权限。更不可取的做法。
chmod的API的代码实现:

#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char **argv)
{
	int ret = -1;
	
	
	if (argc != 2)
	{
		printf("usage: %s filename\n", argv[0]);
		return -1;
	}
	
	ret = chmod(argv[1], S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWOTH);  //设置属主对文件有可读可写可执行权限
	if (ret < 0)                                     //属主所在的组对文件有可读权限,其他用户对文件有可操作权限
	{
		perror("chmod");
		return -1;
	}
	
	return 0;
}


4.读取目录文件

(1) opendir 打开一个目录后得到一个DIR类型的指针 给readdir使用
(2) readdir函数 调用一次就会返回一个struct dirent类型的指针,这个指针指向一个 结构体变量 ,这个 结构体变量里面记录了一个目录项 (所谓目录项就是目录中的一个子文件)。
(3) readdir调用一次只能读出一个目录项 ,要想读出目录中 所有的目录项必须多次调用readdir函数 。readdir函数内部户记住哪个目录项已经被读过了哪个还没读,所以多次调用后不会重复返回已经返回过的目录项。 当readdir函数返回NULL时就表示目录中所有的目录项已经读完了

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char **argv)
{
	DIR *pDir = NULL;
	struct dirent * pEnt = NULL;
	unsigned int cnt = 0;
	
	if (argc != 2)
	{
		printf("usage: %s dirname\n", argv[0]);
		return -1;
	}
	
	pDir = opendir(argv[1]);
	if (NULL == pDir)
	{
		perror("opendir");
		return -1;
	}
	
	while (1)
	{
		pEnt = readdir(pDir);
		if(pEnt != NULL)
		{
			// 还有子文件,在此处理子文件
			printf("name:[%s]	,", pEnt->d_name);
			cnt++;
			if (pEnt->d_type == DT_REG)
			{
				printf("是普通文件\n");
			}
			else
			{
				printf("不是普通文件\n");
			}
		}
		else
		{
			break;
		}
	};
	printf("总文件数为:%d\n", cnt);
	
	return 0;
}

本文标签: 文件系统编程