递归拷贝目录与删除目录 WindowsAPI C++
/*判断一个路径是否是已存在的目录*/
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++的更多相关文章
- Linux下拷贝目录和删除
cp命令用于复制文件或目录,若同事指定两个以上的文件或目录,切最后一个目的地是一个已存在的目录,则它会把前面指定的所有文件或目录复制到此目录中.若同时指定多个文件或目录,而最后的目的地并非一个已存在的 ...
- 原生Java代码拷贝目录
拷贝.移动文件(夹),有三方包commons-io可以用,但是有时候有自己的需求,只能使用原生java代码,这时可以用以下几种方式进行拷贝: 1.使用系统命令(Linux)调用 此种方式对操作系统有要 ...
- PHP-递归扫描目录和删除目录
(1) 通过递归扫描目录并打印 // php递归扫描目录 function scanMyDir($path){ // 打开目录 $dh = opendir($path); echo '<ul&g ...
- php递归操作目录 递归对参数转义
header("Content-type:text/html;charset=utf-8"); //递归读取目录 function reddir($path,$level=0) { ...
- linux cp -r chmod -R 递归拷贝 删除 改权限
在linux下拷贝的时候有时候会出现cp:omitting directory的错误 ,例如 cp:omitting directory "bbs" 说明bbs目录下面还有目录,不 ...
- python 生成、删除、拷贝目录
1. 生成目录 函数原型:distutils.dir_util.mkpath(name[, mode=0777, verbose=0, dry_run=0]) from distutils impor ...
- C# 拷贝目录
public class DirectoryExtends { /// <summary> /// 拷贝目录 /// </summary> /// <param name ...
- (实用篇)PHP不用递归遍历目录下所有文件的代码
<?php /** * PHP 非递归实现查询该目录下所有文件 * @param unknown $dir * @return multitype:|multitype:string */ fu ...
- Java递归列出目录下全部文件
Java递归列出目录下全部文件 /** * 列出指定目录的全部内容 * */ import java.io.*; class hello{ public static void main(String ...
随机推荐
- 34.第一次只出现一次的字符(python)
题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 两次遍历,第一次存放字 ...
- jquery fadeOut()方法 语法
jquery fadeOut()方法 语法 作用:fadeOut() 方法使用淡出效果来隐藏被选元素,假如该元素是隐藏的.大理石平台精度等级 语法:$(selector).fadeOut(speed, ...
- js 获取地址栏信息,可以传递多个参数
//获取多个地址栏信息,name为地址栏参数名,可以传递多个参数 // 形式为 .html?id=12&a=2 function getQueryString(name){ var reg = ...
- Hibernate系列1:入门程序
1.传统的java数据库连接 在传统的开发中,如果要建立java程序和数据库的连接,通常采用JDBC或者Apache Commons DbUtils开发包来完成.他们分别有以下特点: JDBC: 优点 ...
- ftp列出具体目录的所有目录,和目录按照文件类型列出
package com.haiyisoft.cAssistantWeb.util; import java.io.IOException; import java.io.PrintWriter; im ...
- NodejS---require的机制
假设Y是路径,X是文件名或目录名,当 Nodejs 遇到 require(Y+X) 时,按照下面的顺序处理: 1.如果 X 是核心模块(例如:require("http")) a. ...
- LC 877. Stone Game
Alex and Lee play a game with piles of stones. There are an even number of piles arranged in a row, ...
- [Python]python-jenkins 启动需要参数的job
需求: 我要用python通过api,启动这个job,并且启动这个job需要1个参数 安装依赖: pipenv install python-jenkins 熟悉API的使用方法: 了解一个API的最 ...
- CompletableFuture.allOf that doens't return Void(CompletableFuture.allOf不能返回Void的解决方法)
import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Ti ...
- JSP 传统标签extends TagSupport
1.控制JSP页面某一部分内容是否执行 public int doStartTag() 返回EVAL_BODY_INCLUDE,执行 返回SKIP_BODY,不执行 2.控制整个JSP页面是否执行 p ...