c++, windows系统 复制粘贴 任意字符名称 文件

  注意: 如果文件夹的名字也有特殊字符,从命令行或.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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值