写my_ls过程中的几个点

        首先是参数的解析,尽管此次仅要求完成ls三个功能选项,但是即便只有三个功能选项,加上n个文件路径的参数, 手动解析这样的参数还是动作有点多.
还好,Linux提供了一个专门用于解析命令的函数:

getopt()

示例如下:

#include<stdio.h>
#include<unistd.h>
int main(int argc , char ** argv){
    int oc;
    char ec;
    while((oc = getopt(argc,argv,"laR")) != -1){

        switch(oc){
            case 'l':
                printf("有l选项\n");
                break;
            case 'a' :
                printf("有a选项\n");
                break;
            case 'R' :
                printf("有R选项\n");
                break;
            case '?' :
                printf("不支持的参数\n");
                break;
        }
    }
}

getopt()函数每次执行从参数argv中解析出来一个第三个参数包含的选项,并返回,处理完成后 ,它会将原参数中的选项移动到所有参数的最前面.
例如:
执行: my_ls /home -a

int ch;
ch = getopt(argc,argv,"aRl");

完成后,ch的值为a
argv变为 {“my_ls\0”,”-a\0”,”/home\0”}


        然后关于递归显示文件夹的过程中,需要保存各级文件夹的完整路径,如果按照固定大小的数组来保存的话,大概递归到第7层就会爆堆栈,因此在递归过程中,使用结合目录下文件/目录数目以及最长文件名来动态申请的二级数组,在当前函数完成后立即释放相关数据,即可做到完整递归 / 目录. 相关代码如下

申请过程:
    DIR *dir;
    struct dirent *ptr;
    int count = 0;
    int i = 0 ;
    char **filename;
    struct stat buf;
    g_maxlen = 0;

    //获取给定文件夹下的文件数目和最长文件名
    dir = opendir(path);
    if (dir == NULL) {
        if(errno == 13){
            printf("my_ls: 无法打开目录 '%s' :权限不够\n",path);
            return;
        }
    }
    while ((ptr = readdir(dir)) != NULL) {
        if (g_maxlen < strlen(ptr->d_name)) {
            g_maxlen = strlen(ptr->d_name);
        }
        count++;
    }

    closedir(dir);
    filename = (char **) malloc(sizeof(void *) * count);
    if(filename == NULL) my_err("内存申请失败",__LINE__);

    for (i = 0; i < count; i++) {
        filename[i] = (char *) malloc(strlen(path) + g_maxlen + 2);
        if(filename[i] == NULL) my_err("内存申请失败",__LINE__);
    }
释放过程
    for(i = 0; i < count; i++){
        free(filename[i]);
    }
    free(filename);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
myls命令包含9个选项: (1) myls : 在缺省选项的情况下,列出当前文件夹下的普通文件(不包含隐藏文件)。 例如:当前目录包含文件home1.c, home2.c, .home3.c,输入myls后,列出的文件名为home1.c, home2.c. (2) myls –a: 列出当前文件夹下的所有文件(包含隐藏文件)。 例如:当前目录包含文件home1.c、home2.c、.home3.c,输入myls -a后,列出所有的文件名为home1.c, home2.c, .home3.c. (3) myls –l: 列出当前文件夹下普通文件的详细信息,包括文件模式,文件链接数,文件所属用户,文件所属用户组,文件大小,文件最后修改时间,文件名。并且在最后一行显示该目录下所显示的文件的文件块数。 例如:显示drwxr-xr-x 3 eli eli 4096 Nov 16 23:07 Desktop (4) myls -R 递归列出文件及其子文件。 例如:当前目录为home, 其包含文件home1, home2, home3. 其home1是目录文件,包含文件home11, home12, home2不是目录文件,home3是目录文件,包含文件home31, home32。 输入myls –R后,列出的文件名为 ./home: home1 home2 home3 ./home/home1: home11 home12 ./home/home3: home31 home32. (5) myls –u: 列出当前文件夹下用户x的普通文件,若输入myls -u bb,则显示所属bb的普通文件。 例如:文件home1, home2, home3属于aa,文件tmp1, tmp2, tmp3属于bb, 则若输入myls –u aa, 则显示home1,home2,home3,若输入myls -u bb, 则显示tmp1,tmp2,tmp3。 (6) myls –S: 对文件进行排序,需要输入比较参数。 myls –S 的参数包括: time——按最近修改时间排序 name——按文件名的字典序排序 size——按文件的大小从小到大排序 link——按文件链接数从少到多排序 (7) myls -1: 将当前文件夹下的文件按照一行一个的方式显示。 (8) myls –s: 在各个文件开头显示这个文件的文件块大小。 (9) myls /dirname: 显示/dirname下的文件。 编译 gcc main.c -o myls 执行 ./myls 可加若干参数,具体见上描述 程序并不完整,可能会有BUG,希望广大网友指,交流~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值