c++实现移动文件夹到指定文件夹

85 篇文章 4 订阅

不想使用系统接口函数,而更偏爱使用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;
}

欢迎交流与讨论。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值