Linux应用编程和网络编程(2、文件属性)

1、Linux中各种文件类型

1.1、普通文件(- regular file)
(1)文本文件。文件中的内容是由文本构成的,文本指的是ASCLL码字符,或其他码字符。文件中的内容本质上都是数字(不管什么文件内容本质上都是数字,因为计算机中本身就只有0和1),而文本文件中的数字本身应该被理解为这个数字对应的ASCLL码。常见的.c文件、.h文件、.txt文件等都是文本文件。文本文件的好处就是可以被人轻松读懂和编写。
(2)二进制文件。二进制文件中存储的本质上也是数字,只不过这些数字并不是文字的编码数字,而是真正的数字。常见的可执行程序文件(gcc编译生成的a.out,arm-linux-gcc编译连接生成的.bin)都是二进制文件。
对比:从本质上来看(就是刨除文件属性和内容的理解),文本文件和二进制文件并没有任何区别。都是一个文件里面存放了数字。区别就是理解方式不同,如果把这些数字就当做数字处理则就是二进制文件,如果把这些数字按照某种编码格式去解码成文本字符,这就是文本文件。
注意:如何判断一个文件是文本文件还是二进制文件?
在Linux系统层面无法区分文件,只能通过知道该文件的类型然后用该类型的用法去使用(可以使用一些后缀名来确定文件类型)。
使用文本文件时,常规就是用文本文件编辑器去打开编辑,常见的文件编辑器有vim、gedit、notepad++、SourceInsight等。用这些文本文件编辑器去打开文件的时候,编辑器会read读出文件二进制数字内容,然后按照编码格式去解码将其还原成文字。
1.2、目录文件(d directory)
(1)目录就是文件夹,文件夹在Linux中也是一种文件,是一种特殊文件。用vi打开一个文件夹就能看到不同于普通文件的信息,里面存的内容包括这个文件的路径,还有文件夹里面的文件列表。
(2)但是文件夹这种文件比较特殊,本身并不适合用普通的方式来读写。Linux中是使用特殊的一些API来专门读写文件夹
1.3、字符设备文件(c character)
1.4、块设备文件(b block)
(1)设备文件对应的是硬件设备,这个文件虽然在文件系统中存在,但是并不是真正存在于硬盘上的一个文件,而是文件系统虚拟制造出来的叫做虚拟文件系统,如/dev /sys /proc等。
(2)虚拟文件系统中的文件大多数不能或者说不用直接读写的,而是用一些特殊的API产生或者使用的。
1.5、管道文件(p pipe)
1.6、套接字文件(s socket)
1.7、符号链接文件(l link)

2、常用文件属性获取

2.1、stat、fstat、Istat函数简介
(1)每个文件中都附带了这个文件的一些属性(属性信息是存在于文件本身中的,但是它不像文件的内容一样可以被vi打开看到,属性信息只能被专用的API打开看到)
(2)文件属性信息查看的API有三个,stat、fstat、Istat,三个作用一样,参数不同
(3)Linux命令行下还可以去用stat命令去查看文件属性信息,实际上stat命令内部就是使用stat系统调用来实现的
(4)stat和fstat的区别:stat是从文件名出发得到文件属性信息结构体,而fstat是从一个已经打开的文件fd出发得到一个文件的属性信息。一般,文件没有打开就用stat,如果文件打开就用fstat。
(5)lstat与stat/fstat的区别:对于符号链接文件,stat和fstat查阅的是符号链接文件指向的文件的属性,而lstat查阅的是符号链接文件本身的属性。
2.2、struct stat结构体简介
(1)struct stat是内核定义的一个结构体,在<sys/stat.h>声明中,这个结构体中的所有元素加起来就是文件属性
2.3、代码实现查看属性信息

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
 
int main(void)
{
	int ret = -1;
	struct stat buf;
	
	memset(&buf, 0, sizeof(buf));		//memset后buf中全是0
	ret = stat("1.txt", &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);
     

3、stat函数应用

3.1、代码判断文件类型和文件权限
文件类型
(1)文件类型就是-、d、l…
(2)文件属性中的文件类型标志在struct stat结构体的mode_t st_mode元素中,这个元素其实是一个按位来定义的一个位标志。
(3)譬如S_ISREG宏返回值是1表示这个文件是一个普通文件,如果文件不是普通文件则返回值是0
文件权限
(1)st_mode中除了记录文件类型之外,还记录了一个重要信息:文件权限
(2)Linux中并没有给文件权限测试提供宏操作,而只是提供了位掩码,所以只能用位掩码来判断是否具有相应的权限

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
 
int main(void)
{
int ret = -1;
	struct stat buf;
	
	memset(&buf, 0, sizeof(buf));		//memset后buf中全是0
	ret = stat("1.txt", &buf);  		//stat后buf中有内容了
	
	if (ret < 0)
	{
		perror("stat");
		_exit(-1);
     //成功获取了stat结构体,从中可以得到各种属性信息了
#if 0 // 文件类型测试
	// 测试1.txt是否为普通文件,若为普通文件则结果1,否则为0
	int result = S_ISREG(buf.st_mode);
	printf("%d\n", result);
#endif	
 
#if 1 // 文件权限测试
	// 测试1.txt是否为具有可读,若有则结果1,否则为0
	int result = ((buf.st_mode & S_IRUSR)? 1: 0);
	printf("file owner: %u.\n", result);
#endif
	
	return 0;

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值