|
|
- /*---------------------------------------------------------------------------------------------------
- * 实现两个文件之间的更新功能
- *
- * 实现方式,检查oldfile和newfile的last modification,若newfile比oldfile新,则更新oldfile,否则
- * 不进行更新,更新模式分两种:完全更新和追加更新。(见宏定义UP_MODE)
- * 命令格式(EXP):./update pathname_old_file pathname_new_file
- *
- * 编程风格按照大师Richard.Stevens的风格进行,并使用大师提倡的包裹函数,尽管大师已经驾鹤西去,
- * 但他仍然是我学习UNIX/LINUX道路上的一盏明灯,他的书将是驱使我去面对困难的武器,我将永远怀念他
- * 愿他在天堂,依然可以指导那里的人们学习UNIX,愿神眷顾他,阿门
- *
- * 您可以任意复制、使用、转载、修改、甚至是商业用途,不必考虑其版权问题,不用支付任何费用,它是
- * 完全免费的,请遵循GNU。
- * 在您使用的同时,您可以不必考虑作者的任何荣誉问题,请尽管放心使用。
- *
- * 作者:ivanlee
- * Email:ivanlee1@163.com
- *
- * 若你在使用中发现任何漏洞,请通过上述联系方式,通知我,谢谢。
- *
- * 声明:本人将不对您在使用中的任何风险负责,所有现实的、虚拟的、硬件的、软件的任何损害,都由您
- * 自行承担。
- *
- *----------------------------------------------------------------------------------------------------*/
- #include <unistd.h>
- #include <stdio.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <fcntl.h>
- #include <time.h>
- #define MAX_SIZE 8192
- #define UP_MODE 0 //0为全部更新,1为追加更新
- #define OLD_MODE O_WRONLY|O_TRUNC
- #define NEW_MODE O_RDONLY
- int Write(int,char *,size_t);
- int Read(int,char *,size_t );
- int Open(const char *,int);
- int update(const char *,const char *);
- int main(int argc,char **argv)
- {
- int i;
- struct stat statbuff;
- time_t gettime[2];
- if(argc<3)
- {
- fprintf(stderr,"%s\n","few parameter.");
- exit(1);
- }
- for(i=1;i<argc;i++)
- {
- fprintf(stdout,"file: %s\n",argv[i]);
- if(stat(argv[i],&statbuff)==-1)
- {
- fprintf(stderr,"%s\n","get file time erro");
- //exit(1);
- continue;
- }
- gettime[i-1]=statbuff.st_mtime;
- fprintf(stdout," last modifcation time is: %ld \n",gettime[i-1]);
- }
- if(gettime[0]<gettime[1])
- {
- if(update(argv[1],argv[2])!=1)
- {
- fprintf(stderr,"%s\n","update erro");
- exit(1);
- }
- else fprintf(stdout,"%s\n","file update successing");
- }
- else fprintf(stdout,"%s\n","no new file to update");
- return 0;
- }
- int update(const char *old_file,const char *new_file)
- {
- int i;
- int real_size;
- int o_fileno;
- int n_fileno;
- char file_buff[MAX_SIZE];
-
- if(UP_MODE)
- {
- o_fileno=Open(old_file,FILEMODE);
- n_fileno=Open(new_file,FILEMODE);
- }
- else
- {
- o_fileno=Open(old_file,OLD_MODE);
- n_fileno=Open(new_file,NEW_MODE);
- }
-
- real_size=Read(n_fileno,file_buff,MAX_SIZE);
- for(i=0;i<3;i++)
- {
- printf(".");
- sleep(1);
- }
- fprintf(stdout,"\n");
- i=Write(o_fileno,file_buff,real_size);
- return i;
- }
- int Open(const char *filename,int mode)
- {
- int fd;
- if((fd=open(filename,mode))==-1)
- {
- fprintf(stderr,"%s","open file error");
- exit(1);
- }
- return fd;
- }
- int Read(int fileno,char *buf,size_t size)
- {
- int n;
- if((n=read(fileno,buf,size))==-1)
- {
- fprintf(stderr,"%s","read file error");
- exit(1);
- }
- return n;
- }
- int Write(int fileno,char *buf,size_t size)
- {
- if(write(fileno,buf,size)==-1)
- {
- fprintf(stderr,"%s","write file error");
- exit(1);
- }
- return 1;
- }
复制代码 |
|