欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-09 09:51:53
...

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

欢迎交流与讨论。