- #include<cstring>
- #include <iostream>
- #include <io.h>
- #include <string>
- #include <vector>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include<cstdio>
- #include<windows.h>
- #ifndef WIN32
- #include <unistd.h>
- #endif
-
- #ifdef WIN32
- #define stat _stat
- #endif
- using namespace std;
- char *filename;
- vector<std::string> filenames;
- char *filedata;
- char *filedate;
- FILE* tm;
- bool ttt;
- char* tmp;int siz=0;
- int filenamelen,filedatalen;
- int date[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
- long long stime,ttime;
- bool gtime=0,gdata=0,gname=0;
- char filename0[444]={};
- long long gettime0(char a[])
- {
- long long res=0;
- for(int i=0;i<8;i++)
- if(a[i]>'9'||a[i]<'0')
- return -1;
- long long tmp=0;
- for(int i=0;i<4;i++)
- tmp=tmp*10+a[i]-'0';
- for(int i=1970;i<tmp;i++)
- if(i&3)
- res+=365;
- else res+=366;
- if(tmp&3)
- date[2]=28;
- else date[2]=29;
- res*=86400;
- tmp=0;
- for(int i=4;i<6;i++)
- tmp=tmp+a[i]-'0';
- for(int i=1;i<tmp;i++)
- res+=date[i]*86400;
- tmp=0;
- for(int i=6;i<8;i++)
- tmp=tmp*10+a[i]-'0';
- res+=(tmp-1)*86400;
- //res-=86400*117;
- return res;
- }
- int gettime()
- {
- gtime=1;
- int siz=strlen(filedate);
- if(siz!=17)
- return -1;
- stime=gettime0(filedate);
- ttime=gettime0(filedate+9);
- ttime+=86400;
- if(stime<0||ttime<0)
- return -1;
- return 0;
- }
- bool check(string file0)
- {
- int size0;
- if(gtime|gname|gdata)
- {
- size0=file0.size();
- for(int i=0;i<size0;i++)
- filename0[i]=file0[i];
- filename0[size0]=0;
-
-
- }
- if(gtime)
- {
- struct stat result;
- long long mod_time;
- if(stat(filename0, &result)==0)
- mod_time = result.st_mtime;
- if(mod_time>ttime||mod_time<stime)
- return 0;
- }
- if(gname)
- {
- int pos=0;
- for(int i=size0-1;i>0;i--)
- if(filename0[i]=='\\')
- {pos=i+1;break;}
- bool flag=0;
- for(int i=pos;i<size0;i++)
- if(filename0[i]<='Z'&&filename0[i]>='A')
- filename0[i]+=32;
-
- for(int i=pos;i+filenamelen<=size0;i++)
- {
- bool flag2=1;
- for(int j=0,k=i;j<filenamelen;j++,k++)
- if(filename[j]!=filename0[k])
- {flag2=0;break;}
- if(flag2)
- {flag=1;break;}
- }
-
- if(!flag)
- return 0;
- }
- if(gdata)
- {
- tm=fopen(filename0,"rb");
- char buf[66666]={};
- fseek(tm,0,SEEK_END);
- int filelen=ftell(tm);
- fseek(tm,0,SEEK_SET);
- for(int i=0;i<filelen;i=i+65536)
- {
- for(int i=0;i<1000;i++)
- buf[i]=buf[i+65536];
- fseek(tm,i,SEEK_SET);//65636
- if(i+65536>filelen)
- fread(buf+1000,i+65536-filelen,1,tm);
- else
- fread(buf+1000,65536,1,tm);
- int uu=65536;
- if(i+65536>filelen)
- uu=i+65536-filelen;
- for(int i=0;i+filedatalen<=uu+1000;i++)
- {
- bool flag=1;
- for(int j=i,k=0;k<filedatalen;j++,k++)
- if(buf[j]!=filedata[k])
- {flag=0;break;}
- if(flag)
- {fclose(tm);return 1;}
- }
- }
- fclose(tm);
- return 0;
- }
- return 1;
- }
- void getFiles(const std::string & path, std::vector<std::string> & files)
- {
- //文件句柄
- intptr_t hFile = 0;
- //文件信息,_finddata_t需要io.h头文件
- struct _finddata_t fileinfo;
- std::string p;
- if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
- {
- do
- {
- //如果是目录,迭代之
- //如果不是,加入列表
- if ((fileinfo.attrib & _A_SUBDIR))
- {
- if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
- {
- if(check(p.assign(path).append("\").append(fileinfo.name))^ttt)
- files.push_back(p.assign(path).append("\").append(fileinfo.name));
- getFiles(p.assign(path).append("\").append(fileinfo.name), files);
- }
- }
- else
- {
- if(check(p.assign(path).append("\").append(fileinfo.name))^ttt)
- files.push_back(p.assign(path).append("\").append(fileinfo.name));
- }
- } while (_findnext(hFile, &fileinfo) == 0);
- _findclose(hFile);
- }
- }
- void error(char a[])
- {
- printf("%s\n",a);
- exit(-1);
- }
- void update(char a[])
- {
- if(a[0]=='"')
- {
- int siz=strlen(a);
- a[siz-1]=0;
- a=a+1;
- }
- return;
- }
- int main(int argc ,char **argv)
- {
- bool arg=0,uou=0;
- if(argc<2)
- {
- printf("no args\n");return 0;
- }
- int i;
- for(i=1;i<argc;i++)
- {
- switch(argv[i][1])
- {
- default:
- //error("Error args");
- //goto endf;
- break;
- case 'n':
- gname=1;
- i++;
- update(argv[i]),
- filename=argv[i];
- break;
-
- case 'd':
- i++;
- gdata=1;
- update(argv[i]);
- filedata=argv[i];
- if(arg==0)
- arg=1;
- else
- error("Error args");
- break;
-
- case 'i':
- i++;
- gdata=1;
- if(arg==0)
- arg=1;
- else error("Error args");
- tm=fopen(argv[i],"rb");
- fseek(tm,0,SEEK_END);
- siz=ftell(tm);
- fseek(tm,0,SEEK_SET);
- fread(filedata,siz,1,tm);
- break;
- case 'a':
- i++;
- filedate=argv[i];
- if(gettime()==-1){
- printf("Invaild time\n");return 0;}
- break;
- case 'e':
- ttt=1;
- break;
- }
-
- }
- string path=argv[i];
- if(filename!=NULL)
- filenamelen=strlen(filename);
- if(filedata!=NULL)
- filedatalen=strlen(filedata);
- if(i+1<argc)
- {
- freopen(argv[i+1],"wb",stdout);
- }
- for(int i=0;i<filenamelen;i++)
- if(filename[i]<='Z'&&filename[i]>='A')
- filename[i]+=32;
- //用来存储文件名
- //string path ;
- freopen("3.txt","w",stdout);
- //cin>>path;
- getFiles(path, filenames);
- for (auto file : filenames)
- {
- //FILE* foo=fopen(file,"rb");
- //fseek(foo,0,SEEK_END);
- // unsigned int siz=ftell(foo);
- cout << file << std::endl;
- }
- return 0;
-
- }
复制代码
|