#include #include #include #include #include #include #include #define BUFF_SIZE 2048 int filecmp(char *scr,char *copy); int dircmp(char *src, char *copy); void *sbuff; void *cbuff; int filecnt = 0; int dircnt = 0; int main(int argc, char *argv[]){ char sname[_MAX_FNAME]; char cname[_MAX_FNAME]; if(argc < 3){ printf("dircmp \n"); return 1; } sbuff = malloc(BUFF_SIZE); cbuff = malloc(BUFF_SIZE); if(sbuff == NULL || cbuff == NULL){ printf("short of free memory.\n"); return 1; } strcpy(sname,argv[1]); strcpy(cname,argv[2]); if(sname[strlen(sname)-1] != '\\') strcat(sname,"\\"); if(cname[strlen(cname)-1] != '\\') strcat(cname,"\\"); printf("Examine whether \"%s\" is the perfect copy of \"%s\".\n", cname, sname); if(dircmp(sname, cname)) return 1; printf("%d files\n",filecnt); printf("%d directories\n",dircnt); printf("All files corresponded. \\(^^)/\n"); printf("\"%s\" is the perfect copy of \"%s\".\n", cname, sname); printf("completed!\n"); return 0; } int dircmp(char *src, char *copy){ struct _finddata_t c_file; long hFile; char srcwc[_MAX_FNAME]; int ret = 0; puts(src); strcat(strcpy(srcwc,src),"*.*"); hFile = _findfirst(srcwc, &c_file); if(hFile == -1L){ printf("A file doesn't exist in this directory.\n"); ret = -1; } else{ do{ char sname[_MAX_FNAME]; char cname[_MAX_FNAME]; if(strcmp(c_file.name,".")!=0 && strcmp(c_file.name,"..")!=0){ strcpy(sname,src); strcat(sname,c_file.name); strcpy(cname,copy); strcat(cname,c_file.name); if(c_file.attrib & _A_SUBDIR){ strcat(sname,"\\"); strcat(cname,"\\"); dircnt++; if(ret = dircmp(sname,cname)) break; } else{ filecnt++; if(ret = filecmp(sname,cname)) break; } } }while(_findnext( hFile, &c_file ) == 0); _findclose(hFile); } return ret; } int filecmp(char *src,char *copy){ int filesizeS, filesizeC; int sh,ch; int Sreadsize, Creadsize; int ret = 0; sh = _sopen(src, _O_RDONLY, _SH_DENYWR); if(sh == -1){ printf("\"%s\" doesn't open it.\n", src); return -1; } ch = _sopen(copy, _O_RDONLY, _SH_DENYWR); if(ch == -1){ printf("\"%s\" doesn't open it.\n", copy); _close(sh); return -1; } _setmode(sh, _O_BINARY); _setmode(ch, _O_BINARY); filesizeS = _filelength(sh); filesizeC = _filelength(ch); if(filesizeS != filesizeC){ printf("The size of the file doesn't correspond.\n"); printf("\"%s\" : %d byte\n", src, filesizeS); printf("\"%s\" : %d byte\n", copy, filesizeC); ret = -1; } else{ for(;;){ Sreadsize = _read(sh, sbuff, BUFF_SIZE); if(Sreadsize == -1){ printf("\"%s\" read error",src); ret = -1; break; } Creadsize = _read(ch, cbuff, BUFF_SIZE); if(Creadsize == -1){ printf("\"%s\" read error (;_;)",copy); ret = -1; break; } if(memcmp(sbuff, cbuff, Sreadsize)){ printf("Difference was detected. (T_T) \"%s\" \n", copy); ret = -1; break; } if(Sreadsize != BUFF_SIZE) break; } } _close(sh); _close(ch); return ret; }