/*判断一个路径是否是已存在的目录*/
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;
}

  

递归拷贝目录与删除目录 WindowsAPI C++的更多相关文章

  1. Linux下拷贝目录和删除

    cp命令用于复制文件或目录,若同事指定两个以上的文件或目录,切最后一个目的地是一个已存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文件或目录,而最后的目的地并非一个已存在的 ...

  2. 原生Java代码拷贝目录

    拷贝.移动文件(夹),有三方包commons-io可以用,但是有时候有自己的需求,只能使用原生java代码,这时可以用以下几种方式进行拷贝: 1.使用系统命令(Linux)调用 此种方式对操作系统有要 ...

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

    (1) 通过递归扫描目录并打印 // php递归扫描目录 function scanMyDir($path){ // 打开目录 $dh = opendir($path); echo '<ul&g ...

  4. php递归操作目录 递归对参数转义

    header("Content-type:text/html;charset=utf-8"); //递归读取目录 function reddir($path,$level=0) { ...

  5. linux cp -r chmod -R 递归拷贝 删除 改权限

    在linux下拷贝的时候有时候会出现cp:omitting directory的错误 ,例如 cp:omitting directory "bbs" 说明bbs目录下面还有目录,不 ...

  6. python 生成、删除、拷贝目录

    1. 生成目录 函数原型:distutils.dir_util.mkpath(name[, mode=0777, verbose=0, dry_run=0]) from distutils impor ...

  7. C# 拷贝目录

    public class DirectoryExtends { /// <summary> /// 拷贝目录 /// </summary> /// <param name ...

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

    <?php /** * PHP 非递归实现查询该目录下所有文件 * @param unknown $dir * @return multitype:|multitype:string */ fu ...

  9. Java递归列出目录下全部文件

    Java递归列出目录下全部文件 /** * 列出指定目录的全部内容 * */ import java.io.*; class hello{ public static void main(String ...

随机推荐

  1. 计算机HDMI端口与电视机相连

     造冰箱的大熊猫@cnblogs 2019/2/27 打算通过HDMI接口将计算机桌面投影到电视机上,结果遇到问题,折腾了好一阵才搞定.现将这些问题记录下来 1.设备环境 计算机:使用Ubuntu 1 ...

  2. URAL 2036 Intersect Until You're Sick of It 形成点的个数 next_permutation()函数

    A - Intersect Until You're Sick of It Time Limit:500MS     Memory Limit:65536KB     64bit IO Format: ...

  3. Comet OJ - Contest #3 D 可爱的菜菜子 线段树+线性基

    题意 给你一个长度为 \(n\) 的整数序列 \(a_1, a_2, \ldots, a_n\),你需要实现以下两种操作,每个操作都可以用四个整数 \(opt\ l\ r\ v\) 来表示: \(op ...

  4. 异常处理(Exception Handling)

    java里的异常处理(Exception)Exception 是在程序执行过程中发生的一些不希望发生的事情,这些事情如果不被好好处理,就会导致奇怪的结果或者是程序终结.Exception Handle ...

  5. 石川es6课程---11、json

    石川es6课程---11.json 一.总结 一句话总结: ` 感觉更方便了一点,增加了一些简写 ` key-value 一样时可以简写:console.log({ a,b}}) ` 里面函数可以简写 ...

  6. 用Java实现一个二叉树

    介绍 使用Java实现一个int值类型的排序二叉树 二叉树 二叉树是一个递归的数据结构,每个节点最多有两个子节点. 通常二叉树是二分查找树,每个节点它的值大于或者等于在它左子树节点上的值,小于或者等于 ...

  7. ccf 201512-3 画图(90)

    ccf 201512-3 画图(90) #include<iostream> #include<cstring> #include<algorithm> using ...

  8. tensorflow dnn 参考

    https://blog.csdn.net/qq_35976351/article/details/80793487

  9. C代码输出日志

    模板代码,在实际开发中可以使用: Android.mk文件增加(放到 include $(CLEAR_VARS)下面) LOCAL_LDLIBS += -llog C代码中增加 #include &l ...

  10. tensorflow实现线性回归、以及模型保存与加载

    内容:包含tensorflow变量作用域.tensorboard收集.模型保存与加载.自定义命令行参数 1.知识点 """ 1.训练过程: 1.准备好特征和目标值 2.建 ...