不想使用系统接口函数,而更偏爱使用c++,网上找了一圈,竟然没有,于是这里实现,虽然麻烦一点但是可以使用。
关键代码,部分获取名称的函数需要另外实现。
inline bool isSpecialDir(const char *path)
{
return strcmp(path, "..") == 0 || strcmp(path, ".") == 0;
}
bool moveDir(const _tstring& srcPath, const _tstring& dstPath)
{
#ifdef _UNICODE
std::string pathBak = ws2s(addSlashIfNeeded(srcPath));
#else
std::string pathBak = CStdStr::AddSlashIfNeeded(srcPath);
#endif // _UNICODE
_finddata_t fileinfo;
intptr_t hFile;
std::string p;
if((hFile = _findfirst(p.assign(pathBak).append("*.*").c_str(), &fileinfo)) != -1)
{
while(_findnext(hFile, &fileinfo) == 0)
{
if(isSpecialDir(fileinfo.name))
continue;
std::string sCurDirFile = p.assign(pathBak).append(fileinfo.name);
if( fileinfo.attrib & _A_SUBDIR )
{
_tstring stSubDstPath = CStdStr::AddSlashIfNeeded(dstPath) + CStdStr::GetNameOfDir(srcPath);
//如果是目录,开始递归删除目录中的内容
#ifdef _UNICODE
moveDir(s2ws(sCurDirFile), s2ws(stSubDstPath));
#else
moveDir(sCurDirFile, stSubDstPath);
#endif // _UNICODE
}
else
{
_tstring strSubDstFile = CStdStr::AddSlashIfNeeded(dstPath) + sCurDirFile.substr(CStdStr::AddSlashIfNeeded(CStdStr::GetDirOfDir(pathBak)).length());
_tstring strSubDir = CStdStr::GetDirOfFile(strSubDstFile);
_tstring stCurDstFile = CStdStr::AddSlashIfNeeded(strSubDir) + CStdStr::GetNameOfFile(sCurDirFile);
if (!CStdDir::IfAccessDir(strSubDir) && !CStdDir::CreateDir(strSubDir))
{
continue;
}
if(rename(sCurDirFile.c_str(), stCurDstFile.c_str()) == -1)
{
//showError(fileinfo.name);
return false;
}
}
}
_findclose(hFile);//关闭打开的文件句柄,并释放关联资源,否则无法删除空目录
}
//删除空目录,必须在递归返回前调用_findclose,否则无法删除目录
if(_rmdir(pathBak.c_str()) == -1)
{
//showError();//目录非空则会显示出错原因
return false;
}
return true;
}
欢迎交流与讨论。