Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631271
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 11:18:10

 

  1. /*
  2.  *    llist命令(类似ls命令)——主程序
  3.  *    选项
  4.         空 显示当前目录除隐藏文件的所有文件和目录
  5.         -l    带参数,列出文件祥细信息;无参数时,列出当前目录中所有文件的祥细信息,    
  6.         -a 查看隐藏文件和目录
  7.         -d 只列出目录,不包括文件,必须带参数
  8.  *    Lzy     2011-6-12
  9.  */

  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <unistd.h>
  13. #include <string.h>
  14. #include "llist_command.h"
  15. #include "llist_stat.h"

  16. int main(int argc, char *argv[])
  17. {
  18.     int ret;    
  19.     int stat_flag = 0;
  20.     char *dirp;            //保存路径名首地址
  21.     
  22.     
  23.     if(argc == 1)        //命令没有选项和参数时
  24.     {
  25.         pcur_dir(0);        //输出当前目录除隐藏文件的所有文件和目录
  26.     }    
  27.     
  28.     while((ret = getopt(argc, argv, "l::a::d:")) != -1)
  29.     {
  30.         switch(ret)
  31.         {
  32.             case 'a':                        //显示隐藏文件                
  33.                 lplay_dir_all(argv[2]);        //传入选项参数            
  34.                 break;
  35.             
  36.             case 'd':                        //显示隐藏目录                
  37.                 dplay_dir_all(optarg);        //传入选项参数            
  38.                 break;
  39.             
  40.             case 'l':            
  41.                 stat_flag = 1;                //修改标志位
  42.                 //get_stat(optarg);
  43.                 break;
  44.             
  45.             case '?':                        //无此选项
  46.                 printf("no option: %c!\n",optopt);
  47.             default:
  48.                 exit(0);                        
  49.         }    
  50.     }

  51.     if(stat_flag == 1)
  52.     {        
  53.         if(optind == argc)                    //列出当前目录中所有文件的祥细信息
  54.         {
  55.             dirp = "/root"; //get_current_dir();        //得到当前目录
  56.             stat_dir_allpaly(dirp);
  57.         }
  58.         
  59.         for(ret = optind; ret < argc; ret++)    //命令行中还没有被解析的索引
  60.         {
  61.             dirp = argv[ret];
  62.             if(check_dorf(dirp) == -1)
  63.                 return -1;
  64.         }
  65.     }
  66.     
  67.     return 0;
  68. }
  1. #ifndef LLIST_STAT
  2. #define LLIST_STAT

  3. int check_dorf(char *ptr);        //判断是目录还是文件

  4. void access_stat(char *dp);        //获得文件访问权限

  5. int get_stat(char *dp);            //获得文件祥细信息

  6. int stat_dir_allpaly(char *ptr);    //列出目录中所有文件名
  7. #endif
  1. /*
  2.  *    命令选项-a -d 函数实现
  3.  *    判断传入的是目录还是文件
  4.  *    打印文件祥细信息
  5.  *    Lzy     2011-6-12
  6.  */

  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <sys/stat.h>
  10. #include <sys/types.h>
  11. #include <unistd.h>
  12. #include <pwd.h>
  13. #include <grp.h>
  14. #include <time.h>
  15. #include <string.h>
  16. #include "llist_command.h"
  17. #include "llist_stat.h"

  18. /*
  19.  *    判断是目录还是文件
  20.  *    入口参数prt->带路径的目录名或文件名
  21.  *
  22.  */
  23. int check_dorf(char *ptr)
  24. {
  25.     struct stat st;
  26.     
  27.     if(stat(ptr,&st) != 0)            //判断文件类型
  28.     {
  29.         perror("check_dorf stat");
  30.         return -1;
  31.     }
  32.     
  33.     if(S_ISREG(st.st_mode))    //是文件
  34.         get_stat(ptr);
  35.     
  36.     if(S_ISDIR(st.st_mode))    //是目录
  37.         stat_dir_allpaly(ptr);    
  38.     
  39.     return 0;
  40. }

  41. /*
  42.  *    列出目录中所有文件名
  43.  * 入口参数dp->目录名
  44.  */
  45. int stat_dir_allpaly(char *ptr)
  46. {
  47.     struct dirent *dirp;    //定义指向dirent结构的指针
  48.     DIR *dp;                //定义指向DIR结构的指针
  49.     
  50.     dp = llist_open_dir(ptr);    
  51.     
  52.     while((dirp = readdir(dp)) != NULL)        //读取目录文件中所有文件名
  53.     {
  54.         if((strcmp(dirp->d_name, ".") == 0) || (strcmp(dirp->d_name, "..") == 0))    //路过当前目录和父目录
  55.             continue;
  56.         
  57.         //printf("%s\n",dirp->d_name);
  58.         get_stat(dirp->d_name);            //列出目录中所有文件名
  59.     }
  60.     return 0;
  61. }

  62. /*
  63.  *    获得文件访问权限
  64.  * 入口参数dp->文件名可带路径
  65.  */
  66. void access_stat(char *dp)
  67. {
  68.     if(access(dp,R_OK) != -1)        //有读的权限
  69.         printf("R");
  70.     if(access(dp,W_OK) != -1)        //有写的权限
  71.         printf("W");
  72.     if(access(dp,X_OK) != -1)        //有执行的权限
  73.         printf("X");
  74. }

  75. /*
  76.  *    获得文件祥细信息
  77.  *    文件类型、权限、大小、时间
  78.  * 入口参数dp->文件名可带路径
  79.  */
  80. int get_stat(char *dp)
  81. {
  82.     struct stat sbuf;
  83.     struct passwd *pwd;
  84.     struct group *grp;
  85.     struct tm *ttm;    
  86.              
  87.     if(stat(dp, &sbuf) != 0)        //获取文件属性
  88.     {
  89.         perror("get_stat stat");
  90.         return -1;
  91.     }
  92.     
  93.     /*S_IFMT为st_mode屏蔽码*/
  94.     switch(sbuf.st_mode & S_IFMT)            //判断文件类型
  95.     {        
  96.         case S_IFDIR:                    //目录
  97.             printf(" %s ",dp);
  98.             access_stat(dp);            //获取文件的访问权限            
  99.             break;
  100.             
  101.         case S_IFREG:                    //普通文件
  102.             printf(" %s\t",dp);
  103.             access_stat(dp);            //获取文件的访问权限
  104.             
  105.             printf(" size=%d Bytes\t", (int)sbuf.st_size);    //文件大小
  106.             
  107.             pwd = getpwuid(sbuf.st_uid);//获取文件用户ID
  108.             if(pwd)
  109.                 printf(" File Ower:%s\t",pwd->pw_name);
  110.             
  111.             grp = getgrgid(sbuf.st_gid);//获取文件组ID
  112.             if(grp)
  113.                 printf(" File Ower:%s\t",grp->gr_name);
  114.             break;
  115.         
  116.         case S_IFLNK:                    //符号连接
  117.             printf("%s is symbol link file.", dp);
  118.             break;
  119.         
  120.         case S_IFBLK:                    //块设备文件
  121.             printf("%s is block device.[%d %d]",dp,                
  122.                 (int)sbuf.st_dev,
  123.                 (int)sbuf.st_rdev);
  124.             break;
  125.         
  126.         case S_IFCHR:                    //字符设备节点
  127.             printf("%s is char device.[%d %d]",dp,                
  128.                 (int)sbuf.st_dev,
  129.                 (int)sbuf.st_rdev);
  130.             break;            
  131.     }
  132.     
  133.     ttm = localtime(&sbuf.st_atime);        //上次访问时间
  134.     printf(" %s\n",asctime(ttm));        //打印时间

  135.     return 0;
  136. }
  1. #ifndef LLIST_DIR
  2. #define LLIST_DIR

  3. #include <sys/types.h>
  4. #include <dirent.h>
  5. #include <unistd.h>

  6. char *get_current_dir(void);         //获取当前路径

  7. DIR *llist_open_dir(char *ptr);        //打开指定的目录

  8. int llist_read_dir(DIR *ptr, int flag);//列出指定目录下的所有文件和子目录

  9. #endif
  1. /*
  2.  *    目录操作
  3.  *    包括
  4.         获取当前路径
  5.         打开目录指定目录
  6.         以不同方式显示目录中的文件
  7.  *    Lzy     2011-6-12
  8.  */

  9.  #include <stdio.h>
  10.  #include <stdlib.h>
  11.  #include <string.h>
  12.  #include "llist_dir.h"


  13. /*
  14.  *    列出指定目录下的所有文件和子目录
  15.  *    入口参数ptr->打开目录的DIR结构的地址
  16.             flag->    0    显示目录中除隐藏文件的所有文件和目录
  17.             flag->    1    显示所有文件和目录
  18.             flag->    2    显示所有目录
  19.  */
  20. int llist_read_dir(DIR *ptr, int flag)
  21. {
  22.     struct dirent *dirp;    //定义指向dirent结构的指针
  23.     
  24.     while((dirp = readdir(ptr)) != NULL)    //读取目录文件
  25.     {
  26.         if((strcmp(dirp->d_name, ".") == 0) || (strcmp(dirp->d_name, "..") == 0))    //路过当前目录和父目录
  27.             continue;
  28.             
  29.         if(flag == 0)                    //显示目录中除隐藏文件的所有文件和目录
  30.         {
  31.             if(strncmp(dirp->d_name, ".", 1) ==0) //不显示隐藏文件
  32.                 continue;
  33.             printf("%s\n",dirp->d_name);
  34.         }
  35.         
  36.         if(flag == 1)                    //显示所有文件和目录
  37.             printf("%s\n",dirp->d_name);
  38.             
  39.         if(flag == 2)
  40.         {
  41.             if(dirp->d_type == DT_DIR)    //子目录
  42.                 printf("%s\n",dirp->d_name);
  43.         }
  44.     }
  45.     printf("\n");
  46.     
  47.     closedir(ptr);        //关闭目录
  48.     return 0;
  49. }

  50. /*
  51.  *    打开指定的目录
  52.  *    入口参数ptr->目录名的首地址;出口参数DIR->返回DIR结构的地址
  53.  */
  54. DIR *llist_open_dir(char *ptr)
  55. {
  56.     DIR *dp;                //定义指向DIR结构的指针
  57.     
  58.     dp = opendir(ptr);        //打开目录
  59.     if(dp == NULL)            //打开异常
  60.     {
  61.         perror("opendir fail\n");
  62.         return NULL;
  63.     }
  64.     
  65.     chdir(ptr);                //改变工作目录,不要会有问题,
  66.     return dp;
  67. }

  68. /*
  69.  *    获取当前路径
  70.  *    出口参数char *>路径字符串首地址
  71.  */
  72. char *get_current_dir(void)
  73. {
  74.     return (char *)getcwd(NULL,0);            //(char *)不做强制转换会有警告
  75. }
  1. #ifndef LLIST_COMMAND
  2. #define LLIST_COMMAND

  3. #include "llist_dir.h"

  4. void pcur_dir(int flag)    ;                //输出当前目录除隐藏文件的所有文件和目录

  5. void pdir_all(char *dirp, int flag);    //输出指定目录文件和子目录    

  6. int lplay_dir_all(char *ptr);            //显示指定目录下所有文件和子目录

  7. int dplay_dir_all(char *ptr);            //显示指定目录下所有子目录

  8. #endif
  1. /*
  2.  *    命令选项-a -d函数实现
  3.  *    显示指定目录下所有文件和子目录
  4.  *    输出当前目录文件和子目录
  5.  *    Lzy     2011-6-12
  6.  */

  7. #include "llist_command.h"
  8. #include "llist_dir.h"

  9. /*
  10.  *    显示指定目录下所有子目录
  11.  *    入口参数ptr->选项参数
  12.  */
  13. int dplay_dir_all(char *ptr)
  14. {
  15.     if(ptr == NULL)
  16.         pcur_dir(2);    //输出当前目录除隐藏文件的所有文件和目录
  17.     else
  18.         pdir_all(ptr, 2);    //输出指定目录除隐藏文件的所有文件和目录
  19.     
  20.     return 0;
  21. }

  22. /*
  23.  *    显示指定目录下所有文件和子目录
  24.  *    入口参数ptr->选项参数
  25.  */
  26. int lplay_dir_all(char *ptr)
  27. {
  28.     if(ptr == NULL)
  29.         pcur_dir(1);    //输出当前目录除隐藏文件的所有文件和目录
  30.     else
  31.         pdir_all(ptr, 1);    //输出指定目录除隐藏文件的所有文件和目录
  32.     
  33.     return 0;
  34. }

  35. /*
  36.  *    输出指定目录文件和子目录
  37.  *    入口参数dirp->路径名首地址
  38.             flag->0-2
  39.  */
  40. void pdir_all(char *dirp, int flag)
  41. {
  42.     DIR *dp;            //定义指向目录结构体指针    
  43.     
  44.     dp = llist_open_dir(dirp);    //打开目录
  45.     llist_read_dir(dp, flag);
  46. }

  47. /*
  48.  *输出当前目录文件和子目录
  49.  */
  50. void pcur_dir(int flag)        
  51. {
  52.     char *dirp;            //保存路径名首地址
  53.     DIR *dp;            //定义指向目录结构体指针
  54.     
  55.     dirp = get_current_dir();    //得到当前路径
  56.     dp = llist_open_dir(dirp);    //打开当前目录
  57.     llist_read_dir(dp, flag);        
  58. }
  1. ##############################################
  2. #
  3. # 单目录通用Makefile
  4. # 目标文件可自己的设定
  5. # 始须调试程序,修改 CFLAGS 变量为-Wall -g
  6. # By Lzy
  7. # Time 2011-6-3
  8. #
  9. ##############################################

  10. # EXECUTABLE为目标的可执行文件名, 可以根据具体的情况对其进行修改。
  11. EXECUTABLE := llist

  12. # 修改隐含规则中宏
  13. CC := gcc
  14. CFLAGS := -Wall -O2
  15. LDFLAGS +=

  16. # 列出工作目录下所有以“.c”结尾的文件,以空格分隔,将文件列表赋给变量SOURCE
  17. SOURCE := $(wildcard *.c)

  18. # 调用patsubst函数,生成与源文件对应的“.o”文件列表
  19. OBJS := $(patsubst %.c, %.o, $(SOURCE))

  20. # 编译所有".o"文件生成可执行文件
  21. all : $(EXECUTABLE)
  22. $(EXECUTABLE) : $(OBJS)
  23.     @$(CC) $(CFLAGS) $(OBJS) -o $(EXECUTABLE)

  24. # 声明伪目标
  25. .PHONY : clean

  26. # 删除所有中间文件和目标文件
  27. clean :
  28.     @rm -f $(EXECUTABLE) $(OBJS) *~
源码: llist.zip   
阅读(249) | 评论(0) | 转发(0) |
0

上一篇:命令解析

下一篇:目录操作

给主人留下些什么吧!~~