JAVA File类 分析(三)

前面两篇与大家一起研究了unix下的文件系统,本篇将和大家一起分析 文件的属性和文件夹。

ok,废话不说,先来段代码

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
void do_ls(char[]);

	void main(int ac,char *av[]){
		if(ac==1)
			do_ls(".");
		else{
			while(--ac){
				printf("%s:\n",*++av);
				do_ls(*av);
			}
		}
	}
	void do_ls(char dirname[]){
		DIR *dir_ptr;
		struct dirent *direntp;
		if((dir_ptr=opendir(dirname))==NULL)
			fprintf(stderr,"ls1:connot open %s",dirname);
		else{
			while((direntp=readdir(dir_ptr))!=NULL)
				printf("%s\n",direntp->d_name);
			closedir(dir_ptr);
		}
	}


这是一个ls 的简单实现,ls 的算法例如以下

main()

    opendir

    while(readdir)  print filename

    closedir

JAVA File类 分析(三)

上图是编译和执行后的结果图片

JAVA File类 分析(三)

上图是linux 系统中shell的ls

大家能够看到,自己写的ls把根文件夹和上级眼下也打印出来了,而且不能带參数。代码上完了,咱们就開始分析unxi下的文件的属性和文件夹

磁盘上的文件和文件夹组成一颗文件夹树,每一个节点都是文件夹或文件,在unix中每一个文件都位于某个文件夹下

1、什么是文件夹?

文件夹是一种特殊的文件,它的内容是文件和文件夹的名字。 文件夹文件的特点就是永远都不会空,而普通文件能够为空。那么文件夹文件不为空,里面最少要存储什么呢?对了,那就是当前文件夹和上级文件夹。有同学可能要问了,那跟文件夹,没有上级文件夹,他是怎么存储的?那咱们就看看呗。 使用 cd  / 切换到根文件夹 咱们ll  -i 一下 ,把i-节点打印出来,文件夹也是文件,而文件就必须有i-节点,咱们看看截图

JAVA File类 分析(三)
大家应该非常清晰的看到根节点下的当前文件夹和上级文件夹都指向了同一个节点号为2 的I-节点,这是不是也告诉我们 一个i-节点 能够同一时候映射成不同的文件名称。文件夹先分析到这里

2、文件有哪些种,都有哪些属性?

废话不说,还是先上代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int ac,char *av[]){
	struct stat info;
	if(ac>1){
		if(stat(av[1],&info)!=-1){
			show_info(av[1],&info);
		}
	}
}
void show_info(char *filename,struct stat *buf){
	printf("  mode  : %o\n",buf->st_mode);
	printf("  links : %d\n",buf->st_nlink);
	printf("  user  : %d\n",buf->st_uid);
	printf("  group : %d\n",buf->st_gid);
	printf("  size  : %d\n",buf->st_size);
	printf("modtime : %d\n",buf->st_mtime);
	printf(" name   : %s\n",filename);
}

编译执行例如以下图,程序猿仅仅看error 不看waring,哈哈

JAVA File类 分析(三)

咱们在 ll 一下

JAVA File类 分析(三)

咱们自己写的程序与系统提供的ll 差别仅仅是显示格式不同,执行时是root 所以 user 和group 都是 0.size 是514 。 那么咱们重点说一下这个mode,100644 ,读是4写是2可执行时1, 也就是 644 与 rw-r--r-- 相应上,,那么前面的100 是个什么东西啊?

事实上 mode 是一个16位的二进制数,文件类型和权限被编码在这个数中 后几位,每位相应例如以下图

JAVA File类 分析(三)

当中suid,用于改动自己password的权限;sgid用于所属组訪问的权限,且suid也被设置;sticky,对于文件和文件夹用途不同,,对文件而言,是告诉内核,把他放入swap空间,对于文件夹文件,是用于管理暂时文件,谁有权限创建和删除,sticky位文件夹里 的文件仅仅能有创建者删除。通过 ls -l  passwd 命令,它的权限是-rwsr -xr-x

JAVA File类 分析(三)

最后说一下文件的类型:(一共四位二进制,也就是最多有16种文件类型)

常见的类型例如以下:

1、普通文件,2、文件夹文件,3、设备文件,4、socket文件,5、符号链接文件,6、命名管道文件(named pipe)等

至此,还是老话unix文件系统内容非常多,设备文件,socket文件等都没有介绍,每一个文件类型,都有非常多内容,有兴趣的同学,自行学习。unix文件系统简略的介绍到这里。

下篇最终開始分析JAVA的FIle 类了。


JAVA File类 分析(三),布布扣,bubuko.com

JAVA File类 分析(三)

上一篇:Android中的缩略图加载-不浪费一点多余的内存


下一篇:C#分部类和分部方法的使用