我们知道随着Unix系统的不断普及,使用Unix系统的单位和个人也越来越多,特别是Linux的推出,更是风靡全球。基于Unix系统的编程也愈显重要。今天,我们就来学习一个Unix程序的知识。
该程序是一个类似于Unix命令ls 的小工具(取文件名为lx,为了简单起见,此Unix程序只读取了文件的字节数,即st_size)。它可以接受一个参数:指定的目录;也可以不带参数,则默认为当前目录。Unix程序列出指定目录及其子目录中所包含的所有文件的文件名和文件的字节数,并计算出指定目录所占磁盘空间的大小。
Unix程序详细说明如下(程序清单见附录):
1-5行:包含在程序中要用到的一些头文件。
6行:定义常数TABSPACES为TAB键所跳过的空格数,用于规整后面显示语句的屏幕格式。
11行:定义一个变量dir_size用于存放指定目录所占磁盘空间的大小。
12、13行:判断命令行如果没有带参数,则调用list函数,将指定目录置为当前目录,并将返回的目录大小存入变量dir_size中。
14-18行:如果命令行带的参数大于一个,则在屏幕上显示出此命令的简要语法并退出Unix程序。
19、20行:如果命令行只带一个参数,则将此参数作为指定目录调用list函数,同时也返回目录的大小并存入变量dir_size中。
21行:打印出指定目录及其子目录所占磁盘空间的大小。
23行:定义list函数,该函数采用递归法列出字符串name所指定的目录及其子目录中所包含的文件名和文件的大小,并计算name所指定的目录所占用的磁盘空间。
26-32行:定义函数中要用的变量并赋初值。
33行:打印当前所操作目录的目录名。
34行:开始一个循环次数为2的for循环。第1次循环找出目录中包含的所有文件,第2次循环找出目录中包含的所有子目录。
36-40行:打开指定的目录,如果打开成功则返回指向此目录的指针,否则返回NULL。Unix程序打印出出错信息并退出。
41行:开始一个while循环,每循环一次读出目录中的一个文件或子目录,直到读出目录中所有的文件或子目录,readdir返回NULL表示已读到此目录的尾部。
43、44行:判断读出的文件的I标识号,如果为0,则表示该文件已被删除。Unix程序继续执行并读取下一个文件。
45-47行:在读出的文件名前加上绝对或相对路径,以使Unix程序能正确的从文件系统中访问指定的文件。
48-52行:调用lstat获取指定文件的信息,将获取的信息存储到结构sbuf中。如果出错则退出Unix程序。
53行:判断读出的文件是否是一个目录,这个条件用语句(sbuf.st_mode&S_IFMT)==S_IFDIR实现。其它三个条件用于滤除符号链接、目录本身和上一级目录,以避免出现死循环。
55-60行:如果是第2次for循环则递归调用list函数,列出相应的子目录,同时累加目录所占磁盘空间的大小。
63-71行:如果是第1次for循环则打印出文件名和文件所占用的字节数,同时累加所占磁盘空间的大小。用三条打印语句是因为文件名长度不一致,为了打印出的屏幕美观。
75行:关闭相应的目录。
77行:返回本目录所占用的磁盘空间。
本Unix程序在Turbo Linux 4.0和FreeBSD 3.0上调试运行通过。
【编辑推荐】