java实现ls命令_Linux下编写自己的ls命令

Linux系统中ls -l命令可以获得某个目录下文件的具体信息,比如:

gaolu@gaolu-desktop:~/test_folder$

gaolu@gaolu-desktop:~/test_folder$ ls -l

total 20

-rw-r--r-- 1 gaolu gaolu 2578 2009-03-08 02:10 gao.lu.c

-rw-r--r-- 1 gaolu gaolu 2577 2009-03-08 02:07 gao.lu.c~

-rwxr-xr-x 1 gaolu gaolu 9675 2009-03-08 02:12 ls.o

-rwxr--r-- 1 gaolu gaolu    0 2009-03-08 01:50 test1

-rw-r--r-- 1 gaolu gaolu    0 2009-03-08 01:50 test2

-rw-r--r-- 1 gaolu gaolu    0 2009-03-08 01:50 test3

-rw-r--r-- 1 gaolu gaolu    0 2009-03-08 01:51 test4

系统版本不同,显示的内容可能略有差别,主要包括几项:文件所在的inode值,权限信息,用户主和所属的组,最后修改日期,文件名,链接数等等。

【模块划分】

文件的这些基本信息都可以通过stat函数获得,因此只要可以获得某个目录下面的所有文件信息,再依次调用stat函数得到每个文件的信息,就可以实现ls -l命令的基本功能了。

结构如下:

------获得目录下所有文件列表

|

--目录文件列表获得模块-

|                      |

模块划分------                       ------将文件列表存入链表

|                -----------遍历链表

--信息输出模块--|

|

-------对每个文件调用stat获得信息并打印

【主要函数】

(1)DIR* opendir(const char *name)

功能:打开name指定的目录,返回指针,失败返回NULL.

相关头文件:

sys/types.h

dirent.h

(2)struct dirent* readdir(DIR* dir)

功能:获得某个打开目录下的具体内容

相关头文件:

sys/types.h

dirent.h

【代码实现】

#include

#include

#include

#include

#include

#include

#include

//用于保存文件或者目录的名称

typedef struct dir_link{

char d_name[256];

struct dir_link * next;

}dirlink;

//保存单个文件的具体信息,方便输出

typedef struct item_info{

unsigned long inode;

char permission[11];

int owner;

int group;

off_t size;

time_t mod_time;

char name[256];

}info;

dirlink* get_dir_detail(char* dirname)

{

DIR* dir;

struct dirent* drt;

dirlink* head_node =NULL;

dirlink* cur_node = NULL;

dirlink* next_node = NULL;

dir = opendir(dirname);  //打开指定目录

if(NULL == dir)

{

perror("Can't open the directroy.");

return NULL;

}

while((drt = readdir(dir)) != NULL)

{

if((strcmp(drt->d_name,".")==0)||(strcmp(drt->d_name,"..")==0))

{

continue;    //忽略.目录和..目录

}

next_node = (dirlink*)malloc(sizeof(dirlink));

if(NULL == head_node)

{

head_node = next_node;   //首节点

}

else

{

cur_node->next = next_node;

}

cur_node = next_node;

strcpy(cur_node->d_name,drt->d_name);

}

cur_node->next = NULL;    //最后一个节点

closedir(dir);

return head_node;   //返回链表头指针

}

void print_file_info(dirlink* head_node)

{

struct stat file_stat;

dirlink* cur_node = head_node;

info file_info;

static char* perm[] = {"---","--x","-w-","-wx","r--","r-x","rw-","rwx"};

while(NULL != cur_node)   //遍历链表

{

int i = 3;

int j = 0;

unsigned int mask = 0700;

if(stat(cur_node->d_name,&file_stat) == -1)

{

perror("Can't get the information of the file.\n");

cur_node = cur_node->next;

continue;

}

if(S_ISREG(file_stat.st_mode))    //是普通文件

{

file_info.permission[0]='-';

}

if(S_ISDIR(file_stat.st_mode))    //是目录

{

file_info.permission[0]='d';

}0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值