递归拷贝目录与删除目录

/*判断一个路径是否是已存在的目录*/
bool IsDirectory(const std::wstring& pstrPath)
{
	DWORD dw = GetFileAttributes(pstrPath.c_str());
	if (dw == INVALID_FILE_ATTRIBUTES)
	{
		return false;
	}
	return (dw & FILE_ATTRIBUTE_DIRECTORY) != 0;
}

/*复制目录及目录中的所有内容*/
bool CopyFolder(const std::wstring& pstrFolder, const std::wstring& pstrDest)
{
	/*检查输入目录是否是合法目录*/
	if (!IsDirectory(pstrFolder))
	{
		return false;
	}
	if (!IsDirectory(pstrDest))
	{
		CreateDirectoryW(pstrDest.c_str(), NULL);
	}

	std::wstring strFind = pstrFolder;
	if (*strFind.rbegin() != L‘\\‘ &&
		*strFind.rbegin() != L‘/‘)
	{
		strFind.append(L"\\");
	}
	strFind.append(L"*.*");
	std::wstring strDest = pstrDest;
	if (*strDest.rbegin() != L‘\\‘ &&
		*strDest.rbegin() != L‘/‘)
	{
		strDest.append(L"\\");
	}

	/*打开文件查找,查看源目录中是否存在匹配的文件*/
	/*调用FindFile后,必须调用FindNextFile才能获得查找文件的信息*/
	WIN32_FIND_DATA wfd;
	HANDLE hFind = FindFirstFileW(strFind.c_str(), &wfd);
	if (hFind == INVALID_HANDLE_VALUE)
	{
		return false;
	}
	do
	{
		std::wstring strSubFolder;
		std::wstring strDestFolder;
		if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			if (wfd.cFileName[0] == L‘.‘)
			{
				continue;
			}
			else
			{
				strSubFolder = strFind.substr(0, strFind.length() - 3) + wfd.cFileName;
				strDestFolder = strDest + +wfd.cFileName;
				CopyFolder(strSubFolder, strDestFolder);
			}
		}
		else
		{
			strSubFolder = strFind.substr(0, strFind.length() - 3) + wfd.cFileName;
			strDestFolder = strDest + +wfd.cFileName;
			CopyFileW(strSubFolder.c_str(), strDestFolder.c_str(), FALSE);
		}
	} while (FindNextFileW(hFind, &wfd));

	/*删除空目录*/
	FindClose(hFind);
	return true;
}

/*删除目录及目录中的所有内容*/
bool DeleteFolder(const std::wstring& pstrFolder, bool recursive)
{
	/*检查输入目录是否是合法目录*/
	if (!IsDirectory(pstrFolder))
	{
		return false;
	}

	std::wstring strFind = pstrFolder;
	if (*strFind.rbegin() != L‘\\‘ &&
		*strFind.rbegin() != L‘/‘)
	{
		strFind.append(L"\\");
	}
	strFind.append(L"*.*");

	/*打开文件查找,查看源目录中是否存在匹配的文件*/
	/*调用FindFile后,必须调用FindNextFile才能获得查找文件的信息*/
	WIN32_FIND_DATA wfd;
	HANDLE hFind = FindFirstFileW(strFind.c_str(), &wfd);
	if (hFind == INVALID_HANDLE_VALUE)
	{
		return false;
	}
	do
	{
		std::wstring strSubFolder;
		if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			if (wfd.cFileName[0] == L‘.‘)
			{
				continue;
			}
			else if (recursive)
			{
				strSubFolder = strFind.substr(0, strFind.length() - 3) + wfd.cFileName;
				DeleteFolder(strSubFolder, recursive);
			}
		}
		else
		{
			strSubFolder = strFind.substr(0, strFind.length() - 3) + wfd.cFileName;
			DeleteFileW(strSubFolder.c_str());
		}
	} while (FindNextFileW(hFind, &wfd));

	/*删除空目录*/
	FindClose(hFind);
	return RemoveDirectoryW(pstrFolder.c_str()) == TRUE;
}

  

原文地址:https://www.cnblogs.com/xuhuajie/p/11841779.html

时间: 2024-10-24 15:53:05

递归拷贝目录与删除目录的相关文章

Bash Shell 递归实现目录中文件拷贝

前言 今天工作中遇到了一个问题,如果将目录A中的文件拷贝到目录B中(前提目录B没有该文件),并保持文件在目录A的结构.项目重点如下: 需要在目录B中保持文件在目录A中的结构.假设A目录文件 A/test/1.txt,转移到目录B中应该是B/test/1.txt.同时还需要考虑目录B中是否存在test目录,多级目录就要考虑递归了.(还好,bash shell里写个目录递归遍历还是比较简单的.) 需要考虑A中文件是否在B中已经存在同名文件,如果存在,则不需要拷贝. 项目需求示例图如下: 实现 项目需

递归遍历目录拷贝cdh下的lib到一个目录

destpath='/home/hadoop/soft/hadoop-2.0.0-cdh4.5.0/cdhlib/'jarpath='/home/hadoop/soft/hadoop-2.0.0-cdh4.5.0/share/hadoop/'search='jar' iterdir(){    cd $1    for p in `ls`; do        echo "$p" |grep -q "$search"        if [ $? -eq 0 ]  

Linux下拷贝目录和删除

cp命令用于复制文件或目录,若同事指定两个以上的文件或目录,切最后一个目的地是一个已存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文件或目录,而最后的目的地并非一个已存在的目录,则会出现错误信息. cp [参数]  源文件或目录  目标文件或目录 cp参数: -a --archive  保留链接数.文件属性,并递归到拷贝目录,起作用等于dpR选项的组合 -b --backup  删除覆盖目的文件先备份,备份的文件或目录亦建立为符号链接,并指向源文件或目录链接的源文件或

PHP-递归扫描目录和删除目录

(1) 通过递归扫描目录并打印 // php递归扫描目录 function scanMyDir($path){ // 打开目录 $dh = opendir($path); echo '<ul>'; // 循环读取目录 while(($file = readdir($dh)) !== false){ // 先要过滤掉当前目录'.'和上一级目录'..' if($file == '.' || $file == '..') continue; // 为了能够显示中文目录/文件,需要进行转码 echo

python 生成、删除、拷贝目录

1. 生成目录 函数原型:distutils.dir_util.mkpath(name[, mode=0777, verbose=0, dry_run=0]) from distutils import dir_util dir_util.mkpath("new_dir") 2. 删除目录 函数原型:distutils.dir_util.remove_tree(directory[, verbose=0, dry_run=0]) from distutils import dir_ut

C#-拷贝目录内容(文件和子目录)

/// <summary> /// 拷贝目录内容 /// </summary> /// <param name="source">源目录</param> /// <param name="destination">目的目录</param> /// <param name="copySubDirs">是否拷贝子目录</param> public stat

Python递归遍历目录下所有文件

#自定义函数: import ospath="D:\\Temp_del\\a" def gci (path): parents = os.listdir(path) for parent in parents: child = os.path.join(path,parent) #print(child) if os.path.isdir(child): gci(child) # print(child) else: print(child) gci(path) #使用os.walk方

(实用篇)PHP不用递归遍历目录下所有文件的代码

<?php /** * PHP 非递归实现查询该目录下所有文件 * @param unknown $dir * @return multitype:|multitype:string */ function scanfiles($dir) { if (! is_dir ( $dir )) return array (); // 兼容各操作系统 $dir = rtrim ( str_replace ( '\\', '/', $dir ), '/' ) . '/'; // 栈,默认值为传入的目录 $

递归读取目录内容

$path='E:/wamp/phplianxi/';$nested_list = readDirSNested($path, 0);echo '<pre>';var_dump($nested_list);/** * 递归读取目录内容 * @param string $path 需要读取的目录内容 * @return void */function readDirSNested($path) { $nested = array();//存储当前目录下所有内容 $handle = opendir