曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4809|回复: 1
打印 上一主题 下一主题

ls 命令的编写

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2008-11-16 23:19:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>

void do_ls(char[]);

int main(int ac, char *av[])
{
    if( ac == 1 )
    do_ls(".");
    else
    while( --ac ){
        printf("%s:\n", *++av);
        do_ls( *av );
    }
    return 0;
}

void do_ls( char dirname[] )
{
    DIR *dir_ptr;                  /*目录(目录流)*/

    struct dirent *direntp;       /*每一个入口*/

    if( ( dir_ptr = opendir( dirname ) ) == NULL )
    fprintf(stderr, "ls1: can not open %s\n", dirname);

    else
    {
    while( ( direntp = readdir( dir_ptr ) ) != NULL )
   
        printf("%s\n",direntp->d_name );
   
    closedir(dir_ptr);
    }
}

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
沙发
 楼主| 发表于 2008-11-20 02:30:33 | 只看该作者

ls-2

这个版本主要主要还打印出了文件的属性、权限以及连接数用户名、用户组、文件大小、日期时间。但程序不会显示记录总数,也没有将结果按文件名排序,也不支持 -a 选项,它还假设参数是目录名。致命的是,不能显示指定目录的信息。代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>

void do_ls(char[]);
void dostat(char *);
void show_file_info( char *, struct stat *);
void mode_to_letters( int , char[] );
char * uid_to_name( uid_t );
char * gid_to_name( gid_t );


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)            /*打开目录,成功则返回 DIR 结构指针*/
    fprintf(stderr, "ls1: cannot open %s\\n", dirname);
   
    else
    {
    while( ( direntp = readdir( dir_ptr ) ) != NULL )
         dostat( direntp->d_name );

    closedir( dir_ptr );
    }
}

void dostat( char *filename )
{
    struct stat info;

    if( stat( filename, &info ) == -1 )
    perror( filename );
    else
    show_file_info( filename, &info );
}

void show_file_info( char *filename, struct stat *info_p )
{

    char *uid_to_name(), *ctime(), *gid_to_name(), *filemode();
    void mode_to_letters();

    char modestr[11];

    mode_to_letters( info_p->st_mode, modestr );      /*模式到字符的转换*/

    printf("%s", modestr );                           /*输出模式标识符*/

    printf("%4d", (int)info_p->st_nlink);

    printf(" %-8s", uid_to_name(info_p->st_uid));

    printf("%-8s", gid_to_name(info_p->st_gid));

    printf("%8ld  ", (long)info_p->st_size);

    printf("%.12s ", 4 + ctime(&info_p->st_mtime));

    printf("%s\\n",filename);   

}


void mode_to_letters( int mode, char str[] )
{
    strcpy(str,"----------");

    if( S_ISDIR(mode) ) str[0] = 'd';                 /*目录*/
    if( S_ISCHR(mode) ) str[0] = 'c';                 /*字符文件*/
    if( S_ISBLK(mode) ) str[0] = 'b';                 /*块文件*/

    if(mode & S_IRUSR)  str[1] = 'r';
    if(mode & S_IWUSR)  str[2] = 'w';
    if(mode & S_IXUSR)  str[3] = 'x';
   
    if(mode & S_IRGRP)  str[4] = 'r';
    if(mode & S_IWGRP)  str[5] = 'w';
    if(mode & S_IXGRP)  str[6] = 'x';

    if(mode & S_IXOTH)  str[7] = 'r';
    if(mode & S_IXOTH)  str[8] = 'w';
    if(mode & S_IXOTH)  str[9] = 'x';
}

#include <pwd.h>

    char *uid_to_name( uid_t uid )
/*
*返回和 uid 相应的用户名的指针
*/
    {
    struct passwd *getpwuid(), *pw_ptr;
    static char numstr[10];

    if( ( pw_ptr = getpwuid( uid ) ) == NULL ) {
        sprintf(numstr, "%d", uid);      /*没有对应的用户名则 uid 存入 numstr,返回后以字符串的形式打印 uid*/
        return numstr;
    }
    else
        return pw_ptr->pw_name;          /*打印用户名*/
    }


#include <grp.h>

    char *gid_to_name( gid_t gid )
    {
    struct group *getgrgid(), *grp_ptr;
    static char numstr[10];

    if( ( grp_ptr = getgrgid(gid) ) == NULL ){

        sprintf(numstr, "%d", gid);
        return numstr;
    }
    else
        return grp_ptr->gr_name;
    }

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 01:06 , Processed in 0.083130 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表