注意: 如果文件夹的名字也有特殊字符,从命令行或.bat文件运行时 main的第二个参数类型
应该要改成 wchar_t,可自行试试
在vs的源码中可以搜到 _wfinddata_t 和 _finddata_t 两种结构体,前者属于处理宽字符,能处理
所有的字符
下面仅仅是一个例子, 把A文件夹中不属于B文件夹的文件复制到C文件夹内,但没有实现文件夹嵌套
情形, 可以自行实现。
#ifndef UNICODE
#define UNICODE
#endif
#include"io.h"
#include<windows.h>
#ifdef _WINDOWS_
#undef _WINDOWS_
#endif
#include<AFX.h>
#include<string>
#include<iostream>
#include<vector>
#include<set>
#include<fstream>
using namespace std;
const int STR_MAX_LEN = 1000;
void getFiles( wstring path, vector<wstring>& files )
{
//文件句柄
long hFile = 0;
//文件信息
struct _wfinddata_t fileinfo;
wstring p;
if((hFile = _wfindfirst(p.assign(path).append(L"\\*").c_str(),&fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if((fileinfo.attrib & _A_SUBDIR))
{
if(wcscmp(fileinfo.name,L".") != 0 && wcscmp(fileinfo.name,L"..") != 0)
getFiles( p.assign(path).append(L"\\").append((wchar_t *)fileinfo.name), files );
}
else
{
files.push_back(p.assign(path).append(L"\\").append((wchar_t *)fileinfo.name) );
}
}while(_wfindnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
int main(int argc, char *argv[])
{
int i,j;
//wchar_t filePathA[STR_MAX_LEN] ; //= "..\\A";
char filePathA[STR_MAX_LEN] ;
//wchar_t *filePathA = L"..\\zh";
//wcscpy(filePathA,(wchar_t *)argv[1]);
strcpy(filePathA, argv[1]);
//LPCWSTR pathA = (LPCWSTR)filePathA;//_T("D:\\tool\\VS2012test\\txtFiles");
//wchar_t *filePathB = L"..\\notran";
char filePathB[STR_MAX_LEN] ;
//wchar_t filePathB[STR_MAX_LEN] ;
//wcscpy(filePathB, (wchar_t *)argv[2]);//= "..\\B";
strcpy(filePathB, argv[2]);
//wchar_t pathc[STR_MAX_LEN];
char pathc[STR_MAX_LEN];
//wcscpy(pathc, (wchar_t *)argv[3]);
strcpy(pathc,argv[3]);
cout<< filePathA <<' '<<filePathB << ' ' << pathc <<endl;
//wchar_t *pathc = L"..\\C";
wstring pathC((wchar_t *)pathc);
// char * finalTxt = "D:\\tool\\VS2012test\\C.txt";
vector<wstring> filesA;
vector<wstring> filesB;
set<wstring> setB;
getFiles((wchar_t *)filePathA, filesA );
getFiles((wchar_t *)filePathB, filesB );
//cout<<"size: "<<filesA.size()<< " "<<filesB.size() <<endl;
for(i = 0; i != filesB.size(); i++)
{
//cout<<"==> " << filesB[i].substr(strlen(filePathB) + 1)<<endl;
setB.insert(filesB[i].substr(wcslen((wchar_t *)filePathB) + 1));
}
//cout<<"setB : "<<setB.size()<<endl;
int k = 0, kk = 0 , kkk = 0;
for(i = 0; i< filesA.size(); i++)
{
//cout<<"-> "<<filesA[i]<<endl;
kkk ++;
wstring Aname = filesA[i].substr(wcslen((wchar_t *)filePathA) + 1);
if(setB.find(Aname) == setB.end())
{
k++;
//int m = MoveFile((LPCSTR)filesA[i].c_str(), (LPCSTR)pathC.append("\\").append(Aname).c_str()); //剪切
int m = CopyFile((LPCWSTR)filesA[i].c_str(), (LPCWSTR)(pathC + L"\\" + Aname).c_str(),true);
if(m==0)
{
kk++;
//cout<<Aname.c_str()<<endl;
}
//cout<<m<<endl;
}
}
cout<<"k : "<<k<<" "<<kk << " " << kkk << endl;
//system("pause");
return 0;
}