在分析JAVA中的File类之前,先转载一篇《如何用各种编程语言杀死一条龙》
有一位美丽的公主,被关押在一个城堡中最高的塔上,一条凶恶的巨龙看守着她,需要有一位勇士营救她…
下面是各种语言如何想办法将公主从巨龙手中营救出来的。
Java – 赶到那里,找到巨龙,开发出一套由多个功能层组成的恶龙歼灭框架,写几篇关于这种框架的文章…但巨龙并没有被消灭掉。
.NET – 赶到哪里,看到了Java程序员的做法,完全拷贝过来,试图去杀掉巨龙,但巨龙把他吃掉了。
C - 赶到那里,对巨龙不屑一顾,举起剑,砍掉巨龙的头,找到公主…把公主晾在一边,去看看有没有最新提交的linux内核代码。
C++ – 先打造出一根针,然后在上面添加各种功能特征,直到最后汇聚成一把复杂的剑,这把剑复杂到只有他能理解其中的功能…杀死龙,但他过桥时遇到了麻烦,因为内存溢出了。
COBOL - 赶到那里,看到巨龙,认为自己太老了,杀不死这条巨龙,营救不出公主,于是离开了。
Pascal - 他花10年时间开发出一套巨龙歼灭系统…当战斗开始时,他发现这套系统只能关住蜥蜴。
VB - 使用各种组件开发出一套巨龙毁灭武器,他跳到巨龙的后面,在最关键的时刻,他发现这种武器只能在雨夜里工作…
PL/SQL – 分析其它屠龙者的数据,创建出具有多维数据、n向关系的数据表模型、OLAP,花15年时间分析这些数据…当结果出来时,公主已经变成了同性恋者。
Ruby - 盛大出征,号称自己不管做什么都是最强的,当面对巨龙,他亮出了一张画有他杀死一条瘸腿的巨龙的图片…巨龙懒洋洋的吃掉了他。
Smalltalk - 赶到那里,分析巨龙和公主,转身走了,它们是次要问题。
shell - 创造一个超级强大的灭龙武器…但当面对龙的时刻,他忘了如何使用它。
Assembler - 他认为他的方法是正确的,而且是最高效的…但他把D写成了A,杀死了公主。
Fortran - 赶到那里,开发出来一套4万5千行的解决方案,杀死巨龙,与公主见了面…但公主认为他是懦夫,反而倾心于高富帅的Java程序员。
FOX PRO - 开发出一套杀龙系统。外表看起来华丽好用,但实际内部到处补丁,所以,当开始运行这套杀龙武器时,他才发现忘了给DBF加索引。
Lisp:这是一位著名的游侠骑士,在跟很多的屠龙专家交谈后,将他们的技巧模型化,他开发出这套系统,当开始运行系统时,他认识到,他少写了一个括弧。
HTML: 用各种著名的杀龙的剑拼装成一个网页,但他忽视了W3C标准。在跟龙相遇的时刻,他发现他的代码跟浏览器不兼容,于是他变成了赤手空拳。巨龙把他当成小甜点吃了。
Prolog: 他认为需要有一件杀龙的武器。于是在一个有182014件武器的目录里搜索。截止到公主死的那一年,他的成就包括:通晓了各种武器的制造方法,从索引A开始:Atomic Bombs, Anti-Air Weapons, Arches, Ammunition, Axes…
PHP: 开发出一个web网页,当这个运行时,它能通过一个Apache服务器从一个MySQL武器数据库里检索出武器消灭掉$dragon。然而,他在DELETE语句里忘了写WHERE语句,于是杀死了公主,巨龙,女侍,女巫,魔法师,和程序员自己。
JavaScript: 他创建了脚本网页,当网页运行时,脚本会除掉巨龙,他一加载页面,一些美丽的少女就向他抛来了鲜花,发出来尖叫。不幸的是,他没有认真分析这个类似蜥蜴的怪物——也被称作Mozilla,他得到的只是让控制台里填满了error信息,《Book of Mozilla》记载了他是如何被吞掉的。
Basic:他开发出来一种能够杀死纸龙的武器,但不论他如何改进,他发现,他都不能杀死一只比卷毛狮子狗大的龙。
Matlab: 他写出循环语句能计算出用巨箭射死巨龙的弹道。这个程序运行的完美无瑕疵。现在需要的是人能有这样大的力量按这种精度发射这支巨箭。
完好无损的把巨龙杀死的只有C语言,那条巨龙就是Python,好吧,那么那个美丽的公主暂且是土豪吧....这篇文章以幽默故事的形式描述各种语言的特性,寂寞的C语言还没有顾得上美丽的公主,就要赶去修复各种内核缺陷。
似乎转载的这边文章和我们要分析的FIle 类没有任何关联. 那就暂时没关联吧。
File 故名思议,就是文件,那么什么是文件呢,谁来管理文件,当然是文件系统来管理,接下来,将介绍UNIX下文件系统。为了比较直观,咱们先通过UNIX系统编程 实现一个简单的shell命令中pwd 程序,源码如下
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
ino_t get_inode(char *);
void printpathto(ino_t);
void inum_to_name(ino_t,char *,int);
int main()
{
printpathto(get_inode("."));
putchar('\n');
return 0;
}
void printpathto(ino_t this_inode)
{
ino_t my_inode;
char its_name[BUFSIZ];
if(get_inode("..")!=this_inode)
{
chdir("..");
inum_to_name(this_inode,its_name,BUFSIZ);
my_inode=get_inode(".");
printpathto(my_inode);
printf("/%s",its_name);
}
}
void inum_to_name(ino_t inode_to_find,char *namebuf,int buflen)
{
DIR *dir_ptr;
struct dirent *direntp;
dir_ptr=opendir(".");
if(dir_ptr==NULL){
perror(".");
exit(1);
}
while((direntp=readdir(dir_ptr))!=NULL)
if(direntp->d_ino==inode_to_find)
{
strncpy(namebuf,direntp->d_name,buflen);
namebuf[buflen-1]='\0';
closedir(dir_ptr);
return;
}
fprintf(stderr,"error looking for inum %d\n",inode_to_find);
exit(1);
}
ino_t get_inode(char * fname)
{
struct stat info;
if(stat(fname,&info)==-1){
fprintf(stderr,"cannot stat");
perror(fname);
exit(1);
}
return info.st_ino;
}
ok 咱们编译一下 如下图
程序员 不看 waring 只看error,没有error , 运行ll -i 把inode也带出来,看一下生成的文件,注意看一下那个./ 和../ 也是有Inode 的 并且占用了4096K
运行一下
在运行一下pwd
今天先到这里,明天继续本文内容。