最近工作中涉及到很多文件和文件夹的处理,包括删除、检测是否存在、移动、复制等,用过CopyFile、MoveFile等函数,也使用过SHFIleOperation()函数,觉得后者比较好用些,参考了CSDN其他一些前辈的关于文件、文件夹操作的总结,与其他相关网站搜集到的资料,个人总结并封装了一些基本操作函数(注:其中部分函数为其他前辈总结,个人只是进行了验证与一些调整,由于无法查找到引用的原始网址,敬请见谅),介绍如下:

注:在经过实际使用测试后,发现一个经常出现的Bug,即SHFileOperation操作时经常提示“无法操作文件,无法读取源文件或磁盘”,后经查询与验证,此错误原因在于SHFILEOPSTRUCT FileOp结构体中pTo和pFrom赋值必须加上"\0",否则出错,因此在SHCopyFile等函数中做了修改,敬请注意。

#include <shellapi.h>///
// C++文件/文件夹操作相关函数
// 1.检测文件/文件夹是否存在
// 2.获取文件/文件夹全路径,如果是文件夹,就加上"\\"
// 3.删除、拷贝、移动、重命名文件/文件夹// 1.检测文件/文件夹是否存在
// _access函数,函数原型为 int _access( const char *path, int mode );
// CreateFile函数;
// FindFirstFile函数;
// GetFileAttributes函数;
// Shell Lightweight Utility APIs函数 PathFileExists():专门判断文件和目录是否存在的函数
// Header: Declared in Shlwapi.h Import Library: Shlwapi.lib
BOOL FileExists(LPCTSTR lpszFileName)
{  DWORD dwAttributes = GetFileAttributes(lpszFileName);  if(dwAttributes == 0xFFFFFFFF)  {  return false;  }   return TRUE;
}  // 2.获取文件/文件夹全路径,如果是文件夹,就加上"\\"(未完成)
BOOL GetFileFullDirectoryPath(CString &szPath)
{  DWORD dwAttibute;  dwAttibute= GetFileAttributes(szPath);  if (dwAttibute != 0xFFFFFFFF)  {  if ((dwAttibute&FILE_ATTRIBUTE_DIRECTORY) != 0)  {  if (szPath.Right(1) != '\\')  {  szPath += "\\";  }  return TRUE;  }  }  return FALSE;
}  // 3.删除、拷贝、移动、重命名文件/文件夹
#include <windows.h>
#include <stdio.h>// 删除文件或者文件夹
BOOL SHDeleteFile(TCHAR *lpszPath)
{
/*
BOOL SHDeleteFile(CString strPath)
{LPCTSTR lpszPath = LPCTSTR(strPath.GetBuffer());
*/// SHFileOperation函数参数中,pTo和pFrom都应当有"\0"结尾,// 否则容易出现无法读取源文件或磁盘错误,尤其是pFrom必须有;TCHAR lpszPathnew[MAX_PATH * 2] = {0};lstrcpy(lpszPathnew, lpszPath);SHFILEOPSTRUCT FileOp = {0};// FileOp.hwnd = GetSafeHwnd();FileOp.fFlags = FOF_ALLOWUNDO      //允许放回回收站|FOF_NOCONFIRMATION; //不出现确认对话框FileOp.pFrom = lpszPathnew;FileOp.pTo = NULL;  //一定要是NULLFileOp.wFunc = FO_DELETE;  //删除操作return (SHFileOperation(&FileOp) == 0);
}// 复制文件或文件夹
BOOL SHCopyFile(TCHAR *pTo, TCHAR *pFrom)
{
/*
BOOL SHDeleteFile(CString strPathTo, CString strPathFrom)
{LPCTSTR pTo = LPCTSTR(strPathTo.GetBuffer());LPCTSTR pFrom = LPCTSTR(strPathFrom.GetBuffer());
*/TCHAR pFileTo[MAX_PATH * 2] = {0};TCHAR pFileFrom[MAX_PATH * 2] = {0};lstrcpy(pFileFrom, pFrom);lstrcpy(pFileTo, pTo);SHFILEOPSTRUCT FileOp = {0};// FileOp.hwnd = GetSafeHwnd();FileOp.fFlags = FOF_NOCONFIRMATION   //不出现确认对话框|FOF_NOCONFIRMMKDIR  //需要时直接创建一个文件夹,不需用户确定|FOF_SIMPLEPROGRESS; //进度条FileOp.pFrom = pFileFrom;FileOp.pTo = pFileTo;FileOp.wFunc = FO_COPY;return (SHFileOperation(&FileOp) == 0);
}// 移动文件或文件夹
BOOL SHMoveFile(TCHAR *pTo, TCHAR *pFrom)
{
/*
BOOL SHDeleteFile(CString strPathTo, CString strPathFrom)
{LPCTSTR pTo = LPCTSTR(strPathTo.GetBuffer());LPCTSTR pFrom = LPCTSTR(strPathFrom.GetBuffer());
*/TCHAR pFileTo[MAX_PATH * 2] = {0};TCHAR pFileFrom[MAX_PATH * 2] = {0};lstrcpy(pFileFrom, pFrom);lstrcpy(pFileTo, pTo);SHFILEOPSTRUCT FileOp = {0};// FileOp.hwnd = GetSafeHwnd();FileOp.fFlags = FOF_NOCONFIRMATION    //不出现确认对话框|FOF_NOCONFIRMMKDIR;  //需要时直接创建一个文件夹,不需用户确定FileOp.pFrom = pFileFrom;FileOp.pTo = pFileTo;FileOp.wFunc = FO_MOVE;return (SHFileOperation(&FileOp) == 0);
}// 重命名文件或文件夹
BOOL SHReNameFile(TCHAR *pTo, TCHAR *pFrom)
{
/*
BOOL SHDeleteFile(CString strPathTo, CString strPathFrom)
{LPCTSTR pTo = LPCTSTR(strPathTo.GetBuffer());LPCTSTR pFrom = LPCTSTR(strPathFrom.GetBuffer());
*/TCHAR pFileTo[MAX_PATH * 2] = {0};TCHAR pFileFrom[MAX_PATH * 2] = {0};lstrcpy(pFileFrom, pFrom);lstrcpy(pFileTo, pTo);SHFILEOPSTRUCT FileOp = {0};// FileOp.hwnd = GetSafeHwnd();FileOp.fFlags = FOF_NOCONFIRMATION;   //不出现确认对话框FileOp.pFrom = pFileFrom;FileOp.pTo = pFileTo;FileOp.wFunc = FO_RENAME;  return SHFileOperation(&FileOp)==0;}///
// 文件夹:
// 1.检测文件夹是否存在
// 2.创建文件夹
// 3.检测文件夹操作状态
// 4.获取系统文件夹路径(如我的电脑、我的文档等)// 1.检测文件夹是否存在
BOOL DirectoryExists(LPCTSTR lpszFileName)
{  DWORD dwAttributes = GetFileAttributes(lpszFileName);  if(dwAttributes == 0xFFFFFFFF)  {  return FALSE;  }   if((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)  {  return TRUE;  }  else  {  return FALSE;  }
}  // 2.创建文件夹
// CreateDirectory创建文件夹时,父文件夹必须存在,否则失败
// MakeSureDirectoryPathExists可以创建多级文件夹,但是不支持Unicode
// SHCreateDirectoryEx也可以创建多级文件夹,支持Unicode,支持XP SP2以上,Windows Server 2003以上// SHCreateDirectoryEx
#include "shlobj.h"
#pragma comment(lib, "shell32.lib")// strPath最后不包含'\'
BOOL DoCreateDirectory(CString strPath)
{BOOL ret = FALSE;ret = SHCreateDirectoryEx(NULL, strPath.GetBuffer(), NULL);// ret = SHCreateDirectoryEx(NULL, LPCTSTR(strPath), NULL);if (ret == ERROR_SUCCESS){return TRUE;}return FALSE;
}// CreateDirectory(未验证)
BOOL MyCreateDirectory(CString &szFileName)
{  int nIndex = 1;  CString szTemp = szFileName;  do   {  if ( DirectoryExists(szTemp) )  {  szTemp.Format(_T("%s(%d)"), szFileName, nIndex++);  continue;  }
#ifdef _WIN32_WCE  // 根目录创建时不要加'/'  if ( szTemp.ReverseFind(_T('//')) == 0 )  {  szTemp = szTemp.Mid(1);  }
#endif  szFileName = szTemp;  return ( ::CreateDirectory(szFileName, NULL) > 0 );  } while ( nIndex < 1000 );  return FALSE;
} // 3.检测文件夹操作状态(未验证)
BOOL InspectDirectoryPopedom( const CString szPath, DWORD dwFileAccess/* =GENERIC_READ|GENERIC_WRITE */ )
{
#ifdef _WINDOWS_  // wince下不支持  HANDLE hDir=CreateFile(szPath, dwFileAccess, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,   NULL, OPEN_EXISTING,  FILE_FLAG_BACKUP_SEMANTICS, NULL );  if ( hDir==INVALID_HANDLE_VALUE )  {  return false;  }  CloseHandle(hDir);
#endif  return true;
} // 4.获取系统文件夹路径(如我的电脑、我的文档等)(未完成)
CString GetSystemPath(int nAttribute /* =CSIDL_DESKTOP */)
{  CString csSystemPath = _T("");  TCHAR szPath[MAX_PATH + 1] = _T("");  #ifdef  _WIN32_WCE  LPITEMIDLIST ppidl = NULL;
#else  LPITEMIDLIST ppidl = NULL;
#endif  if (SHGetSpecialFolderLocation(NULL, nAttribute, &ppidl) == S_OK)   {  if (SHGetPathFromIDList(ppidl, szPath))  {  csSystemPath = szPath;  }  }  return csSystemPath;
}  int GetSystemPath(CString &SysPath, int nAttribute /* = CSIDL_DESKTOP */)
{TCHAR szPath[MAX_PATH];BOOL ret = SHGetSpecialFolderPath(NULL, szPath, nAttribute, FALSE);SysPath.Format(_T("%s"), szPath);return ret;
}int GetSystemPath(CString &SysPath, int nAttribute /* = CSIDL_DESKTOP */)
{TCHAR szPath[MAX_PATH];if (SUCCEEDED(SHGetFolderPath(NULL, nAttribute, NULL, 0, szPath))){SysPath.Format(_T("%s"), szPath);return TRUE;}return FALSE;
}// SHGetFolderPath示例
// TCHAR szPath[MAX_PATH];
// if(SUCCEEDED(SHGetFolderPath(NULL,
//                              CSIDL_PERSONAL|CSIDL_FLAG_CREATE,
//                              NULL,
//                              0,
//                              szPath)))
// {
//     PathAppend(szPath, TEXT("New Doc.txt"));
//     HANDLE hFile = CreateFile(szPath, );
// }//////
// 文件:
// 1.检测文件是否存在
// 2.检测文件名是否符合要求// 1.检测文件是否存在
BOOL FileExists(LPCTSTR lpszFileName)
{
/*
BOOL FileExists(CString strFileName)
{LPCTSTR lpszFileName = LPCTSTR(strFileName.GetBuffer());
*/DWORD dwAttributes = GetFileAttributes(lpszFileName);  if(dwAttributes == 0xFFFFFFFF)  {  return FALSE;  }   return TRUE;
}  // 2.检测文件名是否符合要求(未完成)
BOOL InspectFileNameRule(const CString &csFileName)
{  // 文件名禁用字符列表  TCHAR szFILERULE[]= { '//', '/', ':', '*', '?', '/"', '<', '>', '|', '/0'};  for( DWORD i=0; i<STRLEN(szFILERULE); i++ )  {  if ( csFileName.Find( szFILERULE[i])>=0 )  {  return false;  }  }  return true;
}  ////
// 使用FileOperation.h库
// 即使用SHFileOperation和SHCreateDirectory函数进行操作#include "FileOperation.h"// 复制文件对象到指定路径(可复制文件/文件夹到指定路径)
// strPathFrom、strPathTo均可为文件名或文件夹路径名
// 暂时只支持strPathTo为文件夹路径名
int CopyFileObject(CString strPathFrom, CString strPathTo)
{if ((strPathFrom.GetLength() <= 0) || (strPathTo.GetLength() <= 0)){return FALSE;}///// 初始化CString szPathFrom = strPathFrom;CString szPathTo   = strPathTo;if (szPathFrom.Right(1) == '\\'){szPathFrom = strPathFrom.Left(strPathFrom.GetLength() - 1);}if (szPathTo.Right(1) == '\\'){szPathTo = strPathTo.Left(strPathTo.GetLength() - 1);}///// 异常判断// 如果源文件对象与目的文件对象相同,不执行复制操作if (szPathFrom.Compare(szPathTo) == 0){return FALSE;}// 检测源路径文件对象是否存在if (!FileExists(LPCTSTR(szPathFrom.GetBuffer()))){return FALSE;}// 如果目标路径文件夹不存在,则新建;否则删除目标文件夹后新建if (!DirectoryExists(LPCTSTR(szPathTo.GetBuffer()))){if (!DoCreateDirectory(szPathTo)){return FALSE;}}/*else{if (!SHDeleteFile(szPathTo.GetBuffer())){return FALSE;}if (!DoCreateDirectory(szPathTo.GetBuffer())){return FALSE;}}*////// 文件对象复制处理if (!SHCopyFile(szPathFrom.GetBuffer(), szPathTo.GetBuffer())){return FALSE;}return TRUE;
}

文件/文件夹操作函数封装(使用SHFileOperation和SHCreateDirectory函数实现)相关推荐

  1. python函数封装总结_python 笔记 之 函数封装成类

    2019独角兽企业重金招聘Python工程师标准>>> # 函数封装成一个类 # 将不同功能封装成不同函数 ''' 0!+1!+2!+3!...+n! 1+1+1+2+6+...+n ...

  2. php删除文件夹函数,PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用...

    先看一下代码 function deldir($dir) { //先删除目录下的文件: $dh=opendir($dir); while ($file=readdir($dh)) { if($file ...

  3. linux 共享内存函数封装,linux ftok()函数 --多进程IPC之共享内存

    系统创建IPC通信(如消息队列.共享内存时)必须指定一个ID值.一般状况下,该id值经过ftok函数获得. ftok原型以下: key_t ftok( char * fname, int id ) f ...

  4. php删除到回收站代码,如何找回回收站删除的文件PHP,删除文件与文件夹操作

    如何找回回收站删除的文件 PHP 删除文件与文件夹操作 unlink与rmdir这两个函数的使用 先看一下代码 代码如下: function deldir($dir) { //先删除目录下的文件: $ ...

  5. php的回收站怎么做,如何找回回收站删除的文件 PHP,删除文件与文件夹操作

    如何找回回收站删除的文件 PHP 删除文件与文件夹操作 unlink与rmdir这两个函数的使用 先看一下代码 代码如下: function deldir($dir) { //先删除目录下的文件: $ ...

  6. react封装函数_react request.js 函数封装

    1.request.js  函数封装 import { Toast } from 'antd-mobile'; import axios from 'axios'; import store from ...

  7. Halcon自定义函数封装方法(全网最详细)

    文章目录 1.名词解释 2.例子介绍 1.处理原图与任务: 2.代码与解析: 3.Halcon函数封装方式 ①明确需求 ②选取函数部分进行函数创建,更改函数接口 ③运行验证与函数更改操作 有网友说不太 ...

  8. lrc格式歌词格式化处理函数封装,返回对象数组

    lrc格式歌词格式化处理函数封装,返回对象数组 函数 /*** lrc格式歌词格式化 * @param { STRING } lrc lrc格式歌词* @return { ARRAY } 返回对象数组 ...

  9. JS(函数返回值、获取非行间样式、函数封装、函数复用、定时器)

    // 函数返回值 // 什么时候需要用:函数外想要使用内部的数据的时候 // 语法: return 返回值 // 1.返回回函数里的值 function fun1 (){ var a = 1; ret ...

最新文章

  1. UVA 1354 Mobile Computing
  2. 解决paramiko获取远程脚本延时返回数据的问题
  3. 【python数据挖掘课程】二十五.Matplotlib绘制带主题及聚类类标的散点图
  4. global在python_在Python中使用“global”关键字
  5. java找不到符号IOException_java:7: 找不到符号
  6. Redis数据结构之列表
  7. (24)System Verilog设计十进制计数器
  8. C# 理解Thread.Sleep()方法 ----转帖
  9. Oracle RAC 11R2配置归档、删除策略,闪回配置完整版
  10. 诱导系统服务器,交通诱导及信息发布系统
  11. 利用LM317的LED恒流源电路图
  12. 论文阅读《PatchMatchNet: Learned Multi-View Patchmatch Stereo》
  13. 2018计算机中文期刊影响因子排名,2018年最新影响因子:839种5分以上期刊名录
  14. STOP 0X00000018关机蓝屏重启问题
  15. 计算机电源功率高好吗,高额定功率等于高功耗吗?教您如何选择计算机电源
  16. Android学习笔记——手机多媒体运用
  17. 彩色星球科技旗下元宇宙平台“彩色世界”亚洲版即将发布;Branch宣布获得3亿美元融资 | 全球TMT...
  18. 20230516(2)
  19. 四川大学网络空间安全学院,考研改科目了!
  20. 七、Debian 10 DHCP中继

热门文章

  1. 关于电弧焊的一些基本常识
  2. 推荐系统-基于领域的协同过滤算法选择(一文足矣)
  3. 移动射击--算法笔试模拟题精解
  4. java入门-markdown语法学习
  5. 如何成为更好的职业人
  6. svn missing delete 原因及处理
  7. NBA球星管理系统----C语言链表带文件
  8. chrome浏览器插件开发-在当前网页中嵌入插件页面
  9. 一加7Pro(oneplus 7Pro)和一加三安装kali nethunter
  10. 使用字节流读取文本文件时,乱码问题的产生与解决