p4.10.c 类似ls命令的简单实现_改进版

时间 : 15-08-02 栏目 : linux编程 作者 : 老薛 评论 : 0 点击 : 1,631 次

注意,红色标注部分

[root@mail file_list]# cat p4.10.c

/*

* update by xk

* date 2015-8-2

* for c

* http://www.bdkyr.com

* 保定开源人

*/

#include <stdio.h>
#include <string.h>/*for strcpy*/
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <time.h>
#include <unistd.h>

const int N_BITS=3;

typedef struct dir_lnk{
    char d_name[256];
    struct dir_lnk * next;
}dirlnk;

typedef struct item_info{
    unsigned int inode;
     char permission[11];
    int owner;
    int group;
    unsigned int size;
    time_t mod_time;
    char name[256];
}info;

dirlnk* get_dir_detail(char* dirname)
{
      DIR* dir;
      struct dirent* drt;
      dir=opendir(dirname);
                       
      if(dir==NULL){
        perror("Cannot open the desired directory");
        return NULL;
        }

      dirlnk* dir_head=NULL;
      dirlnk* cur_item=NULL;

  while((drt=readdir(dir))!=NULL){
    if((strcmp(drt->d_name,".")==0)||(strcmp(drt->d_name,"..")==0))
        continue;
 
    dirlnk *next_item=(dirlnk*)malloc(sizeof(dirlnk));
 
    if(cur_item==NULL)
        cur_item=next_item;
    else
        cur_item->next=next_item;

    cur_item=next_item;

    if(dir_head==NULL)
        dir_head=cur_item;

    strcpy(cur_item->d_name,drt->d_name);
  }

    cur_item->next=NULL;
    closedir(dir);
    
    return dir_head;
}

void print_file_info(dirlnk* dir_head)
{
static char* perm[]={"---","--x","-w-","-wx",
    "r--","r-x","rw-","rwx"};
    unsigned int mask=0700;
struct stat file_stat;
       dirlnk* cur_dir=dir_head;

while(cur_dir!=NULL){
    mask=0700;
    info file_info;

   char *s_time = NULL;
    if(stat(cur_dir->d_name,&file_stat)==-1){
        perror("Cannot get the information of the file!");
        cur_dir=cur_dir->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';

         int i=3;
          int j=0;
        while(i>0)
    {
        file_info.permission[1+j*3]=perm[(file_stat.st_mode & mask)>>(i-1)*N_BITS][0];
        file_info.permission[2+j*3]=perm[(file_stat.st_mode & mask)>>(i-1)*N_BITS][1];
               file_info.permission[3+j*3]=perm[(file_stat.st_mode & mask)>>(i-1)*N_BITS][2];

        j++;
        i--;
               mask>>=N_BITS;
           }
           
    file_info.permission[10]='\0';
    file_info.owner=file_stat.st_uid;
    file_info.group=file_stat.st_gid;
    file_info.mod_time=file_stat.st_atime;
    file_info.size=file_stat.st_size;
    strcpy(file_info.name,cur_dir->d_name);
    file_info.inode=file_stat.st_ino;

    printf("%u  ",file_info.inode);
    printf("%s  ",file_info.permission);
    printf("%d  ",file_info.owner);
    printf("%d  ",file_info.group);
    printf("%u  ",file_info.size);
    printf("%s  ",ctime(&file_info.mod_time));

    s_time=ctime(&file_info.mod_time);      //ctime函数的返回值中有换行符
    s_time[strlen(s_time)-1]=0;                   //将换行符变为0
    printf("%s  ",s_time);            

    printf("%s  \n",file_info.name);
     
     cur_dir=cur_dir->next;
}
}

int main(int argc, char* argv[]){
    
    dirlnk* head=get_dir_detail(".");
    print_file_info(head);
        return 0;
}
2、编译运行

[root@mail file_list]# gcc p4.10.c -o p4.10
[root@mail file_list]# ./p4.10
150915  -rw-r--r--  0  0  4798  Sun Aug  2 04:04:55 2015  my_list.h  
36749  -rwxr-xr-x  0  0  9675  Sun Aug  2 05:30:38 2015  p4.10  
150931  -rw-r--r--  0  0  1732  Sun Aug  2 04:01:30 2015  stu.c  
36742  -rw-r--r--  0  0  2738  Sun Aug  2 05:30:34 2015  p4.10.c  
36750  -rwxr-xr-x  0  0  12027  Sun Aug  2 04:58:55 2015  stu  
36748  -rwxr-xr-x  0  0  14454  Sun Aug  2 05:10:33 2015  file_list  
36735  -rw-r--r--  0  0  3239  Sun Aug  2 05:10:27 2015  file_list.c  
36740  -rw-r--r--  0  0  168  Sun Aug  2 04:42:30 2015  Makefile

现在发现区别了吧,怎么样动手敲一遍吧,很有意思的。

本文标签

除非注明,文章均为( 老薛 )原创,转载请保留链接: http://www.bdkyr.com/xtyw003/886.html

随便看看

0