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

复制文件夹及目录下的所有文件

程序员文章站 2024-03-09 09:56:41
...

复制文件夹及目录下的所有文件

大意是使用通配符 *.*遍历文件夹下所有文件。但是文件名和后缀为空,例如:./ASD/. 若相对路径ASD存在,这个文件居然被认为是存在的。。

	/*判断一个路径是否是已存在的目录*/
BOOL IsDirectory(const char* pstrPath)
{
	if (NULL == pstrPath)
	{
		return FALSE;
	}

	/*去除路径末尾的反斜杠*/
	std::string strPath = pstrPath;
	if (_access(pstrPath, 0) == 0) 
	{
		if (*strPath.rbegin() == '\\' || *strPath.rbegin() == '/')
		{
			return TRUE;
		}
	}
	return FALSE;
}

int copyFolder(const char* pstrSrcFolder, const char* pstrDstFolder)
{
	/*复制目录中的所有内容*/
	if ((NULL == pstrSrcFolder) || (NULL == pstrDstFolder))
		return FALSE;
	/*检查源目录是否是合法目录*/
	if (!IsDirectory(pstrSrcFolder))
		return FALSE;

	/*把文件名称转换为CString类型,并确认目录的路径末尾为反斜杠*/
	std::string strSrcFolder = pstrSrcFolder;
	if (*strSrcFolder.rbegin() != '\\')
	{
		strSrcFolder += "\\";
	}
	std::string strDstFolder = pstrDstFolder;
	if (*strDstFolder.rbegin() != '\\')
	{
		strDstFolder += "\\";
	}

	std::string::size_type pos = strSrcFolder.find('/');
	while (pos != std::string::npos)
	{
		strSrcFolder.replace(pos, 1, "\\");
		pos = strSrcFolder.find('/');
	}
	pos = strDstFolder.find('/');
	while (pos != std::string::npos)
	{
		strDstFolder.replace(pos, 1, "\\");
		pos = strDstFolder.find('/');
	}

	/*如果是目录自身复制,直接返回复制成功*/
	if (0 == strcmp(strSrcFolder.c_str(), strDstFolder.c_str()))
	{
		return TRUE;
	}

	/*如果目的目录不存在,则创建目录*/
	if (!IsDirectory(strDstFolder.c_str()))
	{
		if (!MakeSureDirectoryPathExists(strDstFolder.c_str())) 
		{
			/*创建目的目录失败*/
			return FALSE;
		}
		/*if (!CreateDirectory(strDstFolder.c_str(), NULL))
		{
		
		}*/
	}

	/*创建源目录中查找文件的通配符*/
	std::string strWildcard = strSrcFolder;
	strWildcard += "*.*";

	/*打开文件查找,查看源目录中是否存在匹配的文件*/
	/*调用FindFile后,必须调用FindNextFile才能获得查找文件的信息*/
	WIN32_FIND_DATA  pfileData;
	memset(&pfileData, 0, sizeof(pfileData));
	HANDLE hFindFile = FindFirstFile(strWildcard.c_str(), &pfileData);
	int bWoring = 1;
	while (hFindFile != INVALID_HANDLE_VALUE && bWoring)
	{
		std::string strSrcFile = strSrcFolder;
		strSrcFile += pfileData.cFileName;
		std::string strDstFile = strDstFolder;
		strDstFile += pfileData.cFileName;
		if (IsDirectory(strSrcFile.c_str()))
		{
			if (!copyFolder(strSrcFile.c_str(), strDstFile.c_str()))
			{
				int a = 0;
				//return FALSE;
			}
		}
		else
		{
			
			if ((_access(strSrcFile.c_str(), 0) == 0) && !CopyFile(strSrcFile.c_str(), strDstFile.c_str(), FALSE))
			{
				int a = 0;
				//return FALSE;
			}
		}
		memset(&pfileData, 0, sizeof(pfileData));
		bWoring = FindNextFile(hFindFile, &pfileData);
	}
		
	return TRUE;
}