程序需求:例如有目录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