- 1、本文档共18页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux环境编程-完善ls剖析
实验6-Linux环境编程ls
算法分析
总体流程:
1、对输入的参数进行快速排序)使得参数按字母顺序从A到Z排
2、判断输入参数是文件夹还是文件,文件夹加入head指向的链表,文件加入head指向的链表
3、用sortlslink函数对文件链表phead排序,showlslink函数对文件链表phead所有文件显示
4、用lspath函数文件链表pdhead文件夹遍历并对内的文件排序并排版显示(调用了sortlslinkshowlslink函数,对文件夹内的文件夹进行递归调用
重要函数流程:
sortlslink函数对链表进行冒泡排序使得按字母顺序从A到Z排
showlslink函数根据参数l选择输出全部属性format_long_print函数)还是只输出文件名format_normal_print函数)
format_normal_print函数调用pageMaker函数进行排版,之后在终端上
pageMaker函数先调用getRows函数计算排版后的行数getColsList函数计算每的宽度的文件名链表“置换”操作(“置换”之前输出到终端上是着排列从A到Z,“置换”之后输出到终端上是着排列从A到Z每个文件名加入空格以达到所在列的宽度
getRows函数获得终端的宽度,行数从1开始,计算的显示宽度行数计算列数,每列文件名显示宽度等于每列文件名的长度相加加上列之间的宽度),若宽度小于等于的宽度行数等于名数,行数停止增加并返回这个行数
getColsList函数根据计算并计算列的名的最大长度将其保存在colsList链表里
改进结果
ls与myls对比
ls vmware-tools-distrib/对比
ls m*与./myls m*对比
ls m?ls*与./myls m?ls*对比
遇到的问题及优化的
1、使用*和的参数好名或者文件夹,不是输入的带有通配符的字符串这样程序不需要文件名和文件名
2、getRows函数里行数从递增,效率低下,在文件数量多的情形下需要较多的时间得到行数
改进的myls源代码
#include stdio.h
#include stdlib.h
#include dirent.h
#include string.h
#include sys/stat.h
#include sys/types.h
#include sys/ioctl.h
#include termios.h
#include memory.h
#include malloc.h
#include getopt.h
#include grp.h
#include pwd.h
#include unistd.h
#include fcntl.h
#include time.h
#include error.h
#include sys/types.h
#include linux/kdev_t.h
#define OPT_v 0x0001 /* -v 选项:查看本软件版本 */
#define OPT_h 0x0002 /* -h 选项:查看本软件帮助 */
#define OPT_l 0x0004 /* -l 选项:长型(long)显示 */
#define OPT_a 0x0008 /* -a 选项:显示所有文件(all)*/
#define OPT_R 0x0010 /* -R 选项:显示子目录内容 */
#define OPT_f 0x0020 /* -f 选项:不排序 */
#define DONE_SUCCESS 0
typedef struct _Node
{
char path[1024];
char name[256];
int length;
struct stat st;
struct _Node *pnext;
} nNode;
//由nCol构成的链表用于存储每列字符串在终端的宽度
typedef struct _Col {
int length;//某列字符串在终端的宽度
struct _Col *pnext;
} nCol;
int createlslink(char *path,int flag,nNode **head)
{
DIR * dp;
struct dirent *entry;
struct stat statbuf;
nNode *p;
char abspath[1024];
if((dp=opendir(path))==NULL)
{
fprintf(stderr,cannot open directory:%s\n,path);
文档评论(0)