不同目录下同名文件的提取与拷贝

    技术2022-05-19  28

    程序需求:例如有目录a和b,需要找出两者之下同名的文件,记住是同名不需要格式一样,然后将同名的文件从a拷贝到另外一个目录c下。

    实现如下:(实现了将f盘下a目录和b目录中同名文件从a拷贝到c中)

    #include<stdlib.h> #include<stdio.h> #include<iostream> #include<dirent.h> #include<vector> #include<iterator> #include<string> #define DIRO "f:/a/" #define DIRT "f:/b/" #define DIRTH "f:/c/" #define SIZEOFBUFFER 256*1024L using namespace std; string ddot(string s){ string str; unsigned int pos=s.find("."); str=s.substr(0,s.size()-pos-2); return str; } long filesize(FILE *stream) { long curpos, length; curpos = ftell(stream); fseek(stream, 0L, SEEK_END); length = ftell(stream); fseek(stream, curpos, SEEK_SET); return length; } int copyfile(const char* src,const char* dest) { FILE *fp1,*fp2; int fsize,factread; static unsigned char buffer[SIZEOFBUFFER]; fp1=fopen(src,"rb"); fp2=fopen(dest,"wb"); if (!fp1 || !fp2) return 0; for (fsize=filesize(fp1);fsize>0;fsize-=SIZEOFBUFFER) { factread=fread(buffer,1,SIZEOFBUFFER,fp1); fwrite(buffer,factread,1,fp2); } fclose(fp1); fclose(fp2); return 1; } int main() { DIR *dir1; DIR *dir2; struct dirent *d1; struct dirent *d2; vector<string> sour1; vector<string> sour2; if((dir1=opendir(DIRO))==NULL){ cout<<"open directory "<<DIRO<<" failed~~!"; } if((dir2=opendir(DIRT))==NULL){ cout<<"Open directory "<<DIRT<< "failed~!"; } while((d1=readdir(dir1))!=NULL){ if(strcmp(d1->d_name,".")!=0 && strcmp(d1->d_name,"..")!=0) sour1.push_back(d1->d_name); } while((d2=readdir(dir2))!=NULL){ if(strcmp(d2->d_name,".")!=0 && strcmp(d2->d_name,"..")!=0) sour2.push_back(d2->d_name); } for(vector<string>::iterator iter1=sour1.begin();iter1!=sour1.end();iter1++) for(vector<string>::iterator iter2=sour2.begin();iter2!=sour2.end();iter2++){ string s1=ddot(*iter1); string s2=ddot(*iter2); if((s1.compare(s2))==0){ s1=DIRO+*iter1; const char * tmp1=s1.c_str(); char * s; strcpy(s,tmp1); string des=DIRTH+*iter1; const char * tmp2=des.c_str(); copyfile(s,tmp2); } } system("pause"); return 0; }

    opendir用于打开目录,是类似于流的那种方式,返回一个指向DIR结构体的指针他的参数*dirname是一个字符数组或者字符串常量

    readdir函数用于读取目录,只有一个参数,这个参数主opendir返回的结构体指针,或者叫句柄更容易理解些吧。这个函数也返回一个结构体指针 dirent * ,dirent的结构如下定义                   struct dirent                   {                       long d_ino;                      /* inode number */                       off_t d_off;                     /* offset to this dirent */                       unsigned short d_reclen;         /* length of this d_name */                       char d_name [NAME_MAX+1];        /* file name (null-terminated) */                   }

    if(strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0)如果不加这句,会输出目录,输出结果:...1.txt2.txt


    最新回复(0)