JAVA File类 分析(3)
前面两篇与大家一起研究了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
上图是编译和运行后的结果图片
上图是linux 系统中shell的ls
大家可以看到,自己写的ls把根目录和上级目前也打印出来了,并且不能带参数。代码上完了,咱们就开始分析unxi下的文件的属性和目录
磁盘上的文件和目录组成一颗目录树,每个节点都是目录或文件,在unix中每个文件都位于某个目录下
1、什么是目录?
目录是一种特殊的文件,它的内容是文件和目录的名字。 目录文件的特点就是永远都不会空,而普通文件可以为空。那么目录文件不为空,里面最少要存储什么呢?对了,那就是当前目录和上级目录。有同学可能要问了,那跟目录,没有上级目录,他是怎么存储的?那咱们就看看呗。 使用 cd / 切换到根目录 咱们ll -i 一下 ,把i-节点打印出来,目录也是文件,而文件就必须有i-节点,咱们看看截图
大家应该很清晰的看到根节点下的当前目录和上级目录都指向了同一个节点号为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,哈哈
咱们在 ll 一下
咱们自己写的程序与系统提供的ll 区别只是显示格式不同,运行时是root 所以 user 和group 都是 0.size 是514 。 那么咱们重点说一下这个mode,100644 ,读是4写是2可执行时1, 也就是 644 与 rw-r--r-- 对应上,,那么前面的100 是个什么东西啊?
其实 mode 是一个16位的二进制数,文件类型和权限被编码在这个数中 后几位,每位对应如下图
其中suid,用于修改自己密码的权限;sgid用于所属组访问的权限,且suid也被设置;sticky,对于文件和目录用途不同,,对文件而言,是告诉内核,把他放入swap空间,对于目录文件,是用于管理临时文件,谁有权限创建和删除,sticky位目录里 的文件只能有创建者删除。通过 ls -l passwd 命令,它的权限是-rwsr -xr-x
最后说一下文件的类型:(一共四位二进制,也就是最多有16种文件类型)
常见的类型如下:
1、普通文件,2、目录文件,3、设备文件,4、socket文件,5、符号链接文件,6、命名管道文件(named pipe)等
至此,还是老话unix文件系统内容很多,设备文件,socket文件等都没有介绍,每个文件类型,都有很多内容,有兴趣的同学,自行学习。unix文件系统简略的介绍到这里。
下篇终于开始分析JAVA的FIle 类了。