LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 772|回复: 2

看了几章《UNIX环境高级编程》,写了一个本地文件更新程序,希望能指出一些弊病!

[复制链接]
发表于 2006-9-5 23:43:24 | 显示全部楼层 |阅读模式

  1. /*---------------------------------------------------------------------------------------------------
  2. *                               实现两个文件之间的更新功能
  3. *
  4. *   实现方式,检查oldfile和newfile的last modification,若newfile比oldfile新,则更新oldfile,否则
  5. *   不进行更新,更新模式分两种:完全更新和追加更新。(见宏定义UP_MODE)
  6. *   命令格式(EXP):./update pathname_old_file pathname_new_file
  7. *   
  8. *   编程风格按照大师Richard.Stevens的风格进行,并使用大师提倡的包裹函数,尽管大师已经驾鹤西去,
  9. *   但他仍然是我学习UNIX/LINUX道路上的一盏明灯,他的书将是驱使我去面对困难的武器,我将永远怀念他
  10. *   愿他在天堂,依然可以指导那里的人们学习UNIX,愿神眷顾他,阿门
  11. *   
  12. *   您可以任意复制、使用、转载、修改、甚至是商业用途,不必考虑其版权问题,不用支付任何费用,它是
  13. *   完全免费的,请遵循GNU。
  14. *   在您使用的同时,您可以不必考虑作者的任何荣誉问题,请尽管放心使用。
  15. *
  16. *   作者:ivanlee
  17. *   Email:ivanlee1@163.com  
  18. *   
  19. *   若你在使用中发现任何漏洞,请通过上述联系方式,通知我,谢谢。
  20. *
  21. *   声明:本人将不对您在使用中的任何风险负责,所有现实的、虚拟的、硬件的、软件的任何损害,都由您
  22. *         自行承担。
  23. *
  24. *----------------------------------------------------------------------------------------------------*/

  25. #include <unistd.h>
  26. #include <stdio.h>
  27. #include <sys/stat.h>
  28. #include <sys/types.h>
  29. #include <fcntl.h>
  30. #include <time.h>

  31. #define MAX_SIZE 8192
  32. #define UP_MODE 0                            //0为全部更新,1为追加更新
  33. #define OLD_MODE O_WRONLY|O_TRUNC   
  34. #define NEW_MODE O_RDONLY

  35. int Write(int,char *,size_t);
  36. int Read(int,char *,size_t );
  37. int Open(const char *,int);
  38. int update(const char *,const char *);

  39. int main(int argc,char **argv)
  40. {
  41.    int i;
  42.    struct stat statbuff;
  43.    time_t gettime[2];
  44.    if(argc<3)
  45.    {
  46.       fprintf(stderr,"%s\n","few parameter.");
  47.       exit(1);
  48.    }
  49.    for(i=1;i<argc;i++)
  50.    {
  51.       fprintf(stdout,"file: %s\n",argv[i]);
  52.       if(stat(argv[i],&statbuff)==-1)
  53.       {
  54.          fprintf(stderr,"%s\n","get file time erro");
  55.          //exit(1);
  56.          continue;
  57.       }
  58.       gettime[i-1]=statbuff.st_mtime;
  59.       fprintf(stdout,"   last modifcation time is: %ld \n",gettime[i-1]);
  60.    }
  61.    if(gettime[0]<gettime[1])
  62.    {
  63.       if(update(argv[1],argv[2])!=1)
  64.       {
  65.          fprintf(stderr,"%s\n","update erro");
  66.          exit(1);
  67.       }
  68.       else fprintf(stdout,"%s\n","file update successing");
  69.    }
  70.    else fprintf(stdout,"%s\n","no new file to update");
  71.    return 0;  
  72. }


  73. int update(const char *old_file,const char *new_file)
  74. {
  75.    int i;
  76.    int real_size;
  77.    int o_fileno;
  78.    int n_fileno;
  79.    char file_buff[MAX_SIZE];
  80.    
  81.    if(UP_MODE)
  82.    {     
  83.       o_fileno=Open(old_file,FILEMODE);
  84.       n_fileno=Open(new_file,FILEMODE);
  85.    }
  86.    else
  87.    {
  88.       o_fileno=Open(old_file,OLD_MODE);
  89.       n_fileno=Open(new_file,NEW_MODE);
  90.    }
  91.    
  92.    real_size=Read(n_fileno,file_buff,MAX_SIZE);
  93.    for(i=0;i<3;i++)
  94.    {
  95.       printf(".");
  96.       sleep(1);
  97.    }
  98.    fprintf(stdout,"\n");
  99.    i=Write(o_fileno,file_buff,real_size);
  100.    return i;
  101. }

  102. int Open(const char *filename,int mode)
  103. {
  104.    int fd;
  105.    if((fd=open(filename,mode))==-1)
  106.    {
  107.       fprintf(stderr,"%s","open file error");
  108.       exit(1);
  109.    }
  110.    return fd;
  111. }

  112. int Read(int fileno,char *buf,size_t size)
  113. {
  114.    int n;
  115.    if((n=read(fileno,buf,size))==-1)
  116.    {
  117.       fprintf(stderr,"%s","read file error");
  118.       exit(1);
  119.    }
  120.    return n;
  121. }

  122. int Write(int fileno,char *buf,size_t size)
  123. {
  124.    if(write(fileno,buf,size)==-1)
  125.    {
  126.       fprintf(stderr,"%s","write file error");
  127.       exit(1);
  128.    }
  129.    return 1;
  130. }
复制代码
发表于 2006-9-6 09:00:38 | 显示全部楼层
  1. code
复制代码
好看些。。
回复 支持 反对

使用道具 举报

发表于 2006-9-6 09:20:05 | 显示全部楼层
用 indent排版 用[code]贴出来 斑竹教导 誓不敢忘
回复 支持 反对

使用道具 举报

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

本版积分规则

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