主要是为了支持文件夹的拷贝和删除同时显示进度,判断剩余空间是否足够等。 贴出头文件: /******************************************************************** created: 2010/02/08 created: 8:2:2010 11:59 filename: f:/个人资料_ZWF/自己的源代码/TestFileList/TestFileList/FileList/MyFileOperate.h file path: f:/个人资料_ZWF/自己的源代码/TestFileList/TestFileList/FileList file base: MyFileOperate file ext: h author: zhangwf purpose: 封装文件操作相关函数 *********************************************************************/ #ifndef _MY_FILE_OPERATE_ZWF_H_ #define _MY_FILE_OPERATE_ZWF_H_ // #include <string> using namespace std; typedef wstring MString; // 定义自己使用的类型(UNICODE下使用宽字符串) // // 声明回调函数指针,在拷贝文件过程中获得进度信息 typedef void (WINAPI *PROGRESSCALLBACK)(const wstring &pCurrentFile, long currentCount, long totalCount); // // 定义拷贝文件夹的返回值 enum RETURN_CPYFILE_T { RETURN_CPYFOLDER_SUCCESS = 0, // 拷贝成功 RETURN_CPYFOLDER_SRCINVALIDE, // 源路径无效 RETURN_CPYFOLDER_DSTINVALIDE, // 目标路径无效 RETURN_CPYFOLDER_DSTDIRINSRCDIR, // 拷贝目标目录在源目录中 RETURN_CPYFOLDER_SRCFOLDERNAMEERROR, // 获得源文件夹名称错误 RETURN_CPYFOLDER_NOENOUGHSPACE, // 没有足够的剩余空间 RETURN_CPYFILE_SRCFILEINVALIDE, // 拷贝文件错误 RETURN_CPYFILE_CPYERROR, // 拷贝错误(系统函数返回错误) }; // ===================================================================================== // 操作文件名相关的函数集合 // ===================================================================================== // 是否有效的路径 BOOL PathNameEffective(const MString &filePath); // 文件是否存在 BOOL FileExist(const MString &filePathName); // 路径是否文件夹 BOOL FileIsDirectory(const MString &filePath); // 是否隐藏文件 BOOL FileIsHide(const MString &filePathName); // 是否系统文件 BOOL FileIsSystem(const MString &filePathName); // 是否只读属性 BOOL FileIsReadOnly(const MString &filePathName); // 取得文件大小 unsigned long GetFileSize(const MString &filePathName); // 取得文件扩展名,bAnalyzePath表示是否分析路径的有效性 BOOL GetFileExName(const MString &filePathName, MString &exName, BOOL bAnalyzePath=TRUE); // 取得文件名(不含路径和扩展名或者是目录),bAnalyzePath表示是否分析路径的有效性 BOOL GetFileName(const MString &filePathName, MString &fileName, BOOL bAnalyzePath=TRUE); // 取得文件名(含有扩展名或者是目录),bAnalyzePath表示是否分析路径的有效性 BOOL GetFileFullName(const MString &filePathName, MString &fileFullName, BOOL bAnalyzePath=TRUE); // 取得文件路径(不含文件名和扩展名),bAnalyzePath表示是否分析路径的有效性 BOOL GetFilePath(const MString &filePathName, MString &filePath, BOOL bAnalyzePath=TRUE); // 取得文件创建,最后访问,最后修改时间 BOOL GetFileTime(const MString &filePathName, SYSTEMTIME *pCreatTime=NULL, SYSTEMTIME *pLastAccessTime=NULL, SYSTEMTIME *pLastWriteTime=NULL); // 删除文件夹(blPerfect==TRUE表示删除只读文件,否则不删除只读文件) BOOL DelMDir( const MString &pathName, BOOL bDelHideFile=FALSE, BOOL blPerfect=FALSE, PROGRESSCALLBACK ProgressFunc=NULL, long *pCurrentDelFileCounts=NULL, long totalFileCounts=0 ); // 删除文件夹(blPerfect==TRUE表示删除只读文件,否则不删除只读文件) BOOL DelMDirShowProgress( const MString &pathName, BOOL bDelHideFile=FALSE, BOOL blPerfect=FALSE, PROGRESSCALLBACK ProgressFunc=NULL ); // 删除文件(blPerfect==TRUE表示删除只读文件,否则不删除只读文件) BOOL DelMFile(const MString &filePathName, BOOL blPerfect=FALSE, PROGRESSCALLBACK ProgressFunc=NULL); // 拷贝文件到文件夹(bOverlap表示是否覆盖原有文件,默认为覆盖,blPerfect==TRUE表示覆盖只读文件,否则不覆盖只读文件) RETURN_CPYFILE_T CopyFileToFolder(const MString &srcFilePathName, const MString &dstFolderPath, BOOL bOverlap=TRUE, BOOL blPerfect=FALSE, PROGRESSCALLBACK ProgressFunc=NULL); // 拷贝文件夹到文件夹(bOverlap表示是否覆盖原有文件,默认为覆盖,blPerfect==TRUE表示覆盖只读文件,否则不覆盖只读文件) RETURN_CPYFILE_T CopyFolderToFolder( const MString &srcFolderPath, const MString &dstFolderPath, BOOL bOverlap=TRUE, BOOL blPerfect=FALSE, BOOL bCpyHideFile=FALSE, PROGRESSCALLBACK ProgressFunc=NULL, long *pCurrentCopyFileCounts = NULL, long totalFileCounts = 0 ); // 拷贝文件夹到文件夹[支持进度显示回调函数](bOverlap表示是否覆盖原有文件,默认为覆盖,blPerfect==TRUE表示覆盖只读文件,否则不覆盖只读文件) RETURN_CPYFILE_T CopyFolderToFolderShowProgress( const MString &srcFolderPath, const MString &dstFolderPath, BOOL bOverlap=TRUE, BOOL blPerfect=FALSE, BOOL bCpyHideFile=FALSE, PROGRESSCALLBACK ProgressFunc=NULL ); // 路径是否在文件夹下 BOOL PathInDir(const MString &pathName, const MString &dirPathName); // 取得文件夹下文件总数 long GetDirFileCounts(const MString &dirPathName, BOOL bGetHideFile=FALSE); /******************************************************************** 函数名:GetDiskSpace 作者:zhangwf 日期:2010/01/15 功能:取得磁盘空间剩余容量以及总容量 参数:【输入】deviceName 磁盘名称(可以是磁盘上任意一个目录路径) 【输出】pSpareCapacity 带出剩余容量(单位:字节) 【输出】pTotalCapacity 带出磁盘总容量(单位:字节) 返回:类型(BOOL) TRUE-成功;FALSE-失败; 修改记录: *********************************************************************/ BOOL GetDiskSpace(const MString &deviceName, ULONGLONG *pSpareCapacity, ULONGLONG *pTotalCapacity=NULL); // 判断目标路径磁盘是否有足够的空间存放当前文件 BOOL EnoughSpaceForFile(const MString &filePathName, const MString &dstDirPath); // #endif 贴出源文件: /******************************************************************** created: 2010/02/08 created: 8:2:2010 11:59 filename: f:/个人资料_ZWF/自己的源代码/TestFileList/TestFileList/FileList/MyFileOperate.cpp file path: f:/个人资料_ZWF/自己的源代码/TestFileList/TestFileList/FileList file base: MyFileOperate file ext: cpp author: zhangwf purpose: 封装文件操作相关函数 *********************************************************************/ // #include <Windows.h> #include "MyFileOperate.h" // // =========文件操作相关集合函数实现===================================================================================================== // 是否有效的路径 BOOL PathNameEffective(const MString &filePath) { if (GetFileAttributes(filePath.c_str()) == INVALID_FILE_ATTRIBUTES) { return FALSE; } return TRUE; } // 文件是否存在 BOOL FileExist(const MString &filePathName) { FILE *pFile = _wfopen(filePathName.c_str(), _T("r")); if (pFile == NULL) { return FALSE; } else { fclose(pFile); return TRUE; } } // 路径是否文件夹 BOOL FileIsDirectory(const MString &filePath) { DWORD attribute = ::GetFileAttributes(filePath.c_str()); if (attribute == INVALID_FILE_ATTRIBUTES) { return FALSE; } if ((attribute & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) { return TRUE; } return FALSE; } // 是否隐藏文件 BOOL FileIsHide(const MString &filePathName) { DWORD attribute = ::GetFileAttributes(filePathName.c_str()); if (attribute == INVALID_FILE_ATTRIBUTES) { return FALSE; } if ((attribute & FILE_ATTRIBUTE_HIDDEN) == FILE_ATTRIBUTE_HIDDEN) { return TRUE; } return FALSE; } // 是否系统文件 BOOL FileIsSystem(const MString &filePathName) { DWORD attribute = ::GetFileAttributes(filePathName.c_str()); if (attribute == INVALID_FILE_ATTRIBUTES) { return FALSE; } if ((attribute & FILE_ATTRIBUTE_SYSTEM) == FILE_ATTRIBUTE_SYSTEM) { return TRUE; } return FALSE; } // 是否只读属性 BOOL FileIsReadOnly(const MString &filePathName) { DWORD attribute = ::GetFileAttributes(filePathName.c_str()); if (attribute == INVALID_FILE_ATTRIBUTES) { return FALSE; } if ((attribute & FILE_ATTRIBUTE_READONLY) == FILE_ATTRIBUTE_READONLY) { return TRUE; } return FALSE; } // 取得文件大小 unsigned long GetFileSize(const MString &filePathName) { unsigned long ulSize = 0; FILE *pFile = _wfopen(filePathName.c_str(), _T("r")); if (pFile == NULL) { return ulSize; } // 取得文件大小 fseek(pFile, 0, SEEK_END); ulSize = ftell(pFile); fclose(pFile); return ulSize; } // 取得文件扩展名 BOOL GetFileExName(const MString &filePathName, MString &exName, BOOL bAnalyzePath) { // 不是文件 if (bAnalyzePath==TRUE && FileExist(filePathName)==FALSE) { return FALSE; } exName = filePathName.substr(filePathName.rfind(_T('.')) + 1); return TRUE; } // 取得文件名(不含路径和扩展名或者是目录) BOOL GetFileName(const MString &filePathName, MString &fileName, BOOL bAnalyzePath) { if (bAnalyzePath==TRUE && PathNameEffective(filePathName)==FALSE) { return FALSE; } // 是文件 if (FileExist(filePathName)==TRUE) { MString strFileFullName = filePathName.substr(filePathName.rfind(_T('//')) + 1); fileName = strFileFullName.substr(0, strFileFullName.rfind(_T('.'))); return TRUE; } // 是目录 else { fileName = filePathName.substr(filePathName.rfind(_T('//')) + 1); return TRUE; } } // 取得文件名(含有扩展名或者是目录) BOOL GetFileFullName(const MString &filePathName, MString &fileFullName, BOOL bAnalyzePath) { if (bAnalyzePath==TRUE && PathNameEffective(filePathName)==FALSE) { return FALSE; } fileFullName = filePathName.substr(filePathName.rfind(_T('//')) + 1); return TRUE; } // 取得文件路径(不含文件名和扩展名) BOOL GetFilePath(const MString &filePathName, MString &filePath, BOOL bAnalyzePath) { if (bAnalyzePath==TRUE && PathNameEffective(filePathName)==FALSE) { return FALSE; } // 是根目录 filePath = filePathName.substr(0, filePathName.rfind(_T('//'))); if (filePath == _T("")) { filePath = _T("//"); } return PathNameEffective(filePath); } // 取得文件创建,最后访问,最后修改时间 BOOL GetFileTime(const MString &filePathName, SYSTEMTIME *pCreatTime, SYSTEMTIME *pLastAccessTime, SYSTEMTIME *pLastWriteTime) { // 打开文件 HANDLE hFile = CreateFile(filePathName.c_str(), // file to open GENERIC_READ, // open for reading FILE_SHARE_READ, // share for reading NULL, // default security OPEN_EXISTING, // existing file only FILE_ATTRIBUTE_NORMAL, // normal file NULL); // no attr. template // 取得时间 FILETIME ftCreat, ftAccess, ftWrite; if (::GetFileTime(hFile, &ftCreat, &ftAccess, &ftWrite) == FALSE) { return FALSE; } // 转换为本地时间 if (pCreatTime != NULL) { FileTimeToSystemTime(&ftCreat, pCreatTime); } if (pLastAccessTime != NULL) { FileTimeToSystemTime(&ftAccess, pLastAccessTime); } if (pLastWriteTime != NULL) { FileTimeToSystemTime(&ftWrite, pLastWriteTime); } // 关闭打开的文件返回 CloseHandle(hFile); return TRUE; } // 删除文件夹(blPerfect==TRUE表示删除只读文件,否则不删除只读文件) BOOL DelMDir(const MString &pathName, BOOL bDelHideFile, BOOL blPerfect, PROGRESSCALLBACK ProgressFunc, long *pCurrentDelFileCounts, long totalFileCounts) { // 无效的路径 if (FileIsDirectory(pathName) == FALSE) { return FALSE; } // 得到搜索文件名 MString searchFileName = pathName + _T("//*.*"); // 查找第一文件 WIN32_FIND_DATA wfd; memset(&wfd, 0, sizeof(wfd)); HANDLE hFind = FindFirstFile(searchFileName.c_str(), &wfd); // 记录找到的文件 MString findFileName = pathName; // 找到文件,开始遍历 if (hFind != INVALID_HANDLE_VALUE) { DWORD dwAttrs = 0; // 保存文件属性 do { // 得到找到的文件绝对路径 findFileName = pathName + _T("//") + wfd.cFileName; // 得到文件属性 dwAttrs = GetFileAttributes(findFileName.c_str()); // 是有效的属性 if (dwAttrs != INVALID_FILE_ATTRIBUTES) { // 不是隐藏文件,或是隐藏文件且处理隐藏文件 if ((!((dwAttrs) & FILE_ATTRIBUTE_HIDDEN)) || (((dwAttrs) & FILE_ATTRIBUTE_HIDDEN) && bDelHideFile==TRUE)) { // 是文件夹 if ((dwAttrs) & FILE_ATTRIBUTE_DIRECTORY) { DelMDir(findFileName.c_str(), bDelHideFile, blPerfect, ProgressFunc, pCurrentDelFileCounts, totalFileCounts); } else { if (blPerfect == TRUE) { // 是只读属性,设置为常规属性 if ((dwAttrs) & FILE_ATTRIBUTE_READONLY) { ::SetFileAttributes(findFileName.c_str(), FILE_ATTRIBUTE_NORMAL); } } // 删除文件数量增加 if (pCurrentDelFileCounts != NULL) { (*pCurrentDelFileCounts) += 1; } // 执行回调函数 if (ProgressFunc != NULL) { ProgressFunc(findFileName, *pCurrentDelFileCounts, totalFileCounts); } // 删除文件 ::DeleteFile(findFileName.c_str()); } } } // 清除上次内容 memset(&wfd, 0, sizeof(wfd)); } while (FindNextFile(hFind, &wfd) != 0); // 关闭查询 FindClose(hFind); } // 删除文件夹 return ::RemoveDirectory(pathName.c_str()); } // 删除文件夹(blPerfect==TRUE表示删除只读文件,否则不删除只读文件) BOOL DelMDirShowProgress(const MString &pathName, BOOL bDelHideFile, BOOL blPerfect, PROGRESSCALLBACK ProgressFunc) { // 计算文件总数量 long fileTotalCounts = GetDirFileCounts(pathName, bDelHideFile); // 记录当前已经拷贝文件数量 long currentDelFileCounts = 0; // 返回删除过程 return DelMDir(pathName, bDelHideFile, blPerfect, ProgressFunc, ¤tDelFileCounts, fileTotalCounts); } // (blPerfect==TRUE表示删除只读文件,否则不删除只读文件) BOOL DelMFile(const MString &filePathName, BOOL blPerfect, PROGRESSCALLBACK ProgressFunc) { // 文件是否存在 if (FileExist(filePathName) == FALSE) { return FALSE; } // 只读文件改变其属性 if (blPerfect == TRUE) { if (FileIsReadOnly(filePathName) == TRUE) { SetFileAttributes(filePathName.c_str(), FILE_ATTRIBUTE_NORMAL); } } // 执行回调函数 if (ProgressFunc != NULL) { ProgressFunc(filePathName, 1, 1); } // 删除文件 return ::DeleteFile(filePathName.c_str()); } // 拷贝文件到文件夹(bOverlap表示是否覆盖原有文件,默认为覆盖,blPerfect==TRUE表示覆盖只读文件,否则不覆盖只读文件) RETURN_CPYFILE_T CopyFileToFolder(const MString &srcFilePathName, const MString &dstFolderPath, BOOL bOverlap, BOOL blPerfect, PROGRESSCALLBACK ProgressFunc) { MString fileFullName; if (GetFileFullName(srcFilePathName, fileFullName) == FALSE) { return RETURN_CPYFILE_SRCFILEINVALIDE; } // 是文件夹 if (FileIsDirectory(srcFilePathName) == TRUE) { return RETURN_CPYFILE_SRCFILEINVALIDE; } // 得到目标文件名 MString dstFilePathName = dstFolderPath + _T("//") + fileFullName; // 处理只读文件,在覆盖的情况下 if (bOverlap==TRUE && blPerfect==TRUE) { if (FileIsReadOnly(dstFilePathName) == TRUE) { ::SetFileAttributes(dstFilePathName.c_str(), FILE_ATTRIBUTE_NORMAL); } } // 检测是否有足够的磁盘空间 RETURN_CPYFILE_T retValue = RETURN_CPYFOLDER_SUCCESS; if (EnoughSpaceForFile(srcFilePathName, dstFolderPath) == TRUE) { // 执行回调 if (ProgressFunc != NULL) { ProgressFunc(srcFilePathName, 1, 1); } // 复制文件 BOOL bCpyRet = ::CopyFile(srcFilePathName.c_str(), dstFilePathName.c_str(), !bOverlap); retValue = (bCpyRet==TRUE) ? RETURN_CPYFOLDER_SUCCESS : RETURN_CPYFILE_CPYERROR; } else { retValue = RETURN_CPYFOLDER_NOENOUGHSPACE; } return retValue; } // 拷贝文件夹到文件夹(bOverlap表示是否覆盖原有文件,默认为覆盖,blPerfect==TRUE表示覆盖只读文件,否则不覆盖只读文件) RETURN_CPYFILE_T CopyFolderToFolder(const MString &srcFolderPath, const MString &dstFolderPath, BOOL bOverlap, BOOL blPerfect, BOOL bCpyHideFile, PROGRESSCALLBACK ProgressFunc, long *pCurrentCopyFileCounts, long totalFileCounts) { // 源目录是否有效 if (FileIsDirectory(srcFolderPath) == FALSE) { return RETURN_CPYFOLDER_SRCINVALIDE; } // 目标目录是否有效 if (FileIsDirectory(dstFolderPath) == FALSE) { return RETURN_CPYFOLDER_DSTINVALIDE; } // 判断目标路径是否是源目录的子目录 if (PathInDir(dstFolderPath, srcFolderPath) == TRUE) { return RETURN_CPYFOLDER_DSTDIRINSRCDIR; } // 获得源文件夹名称 MString srcFolderName; if (GetFileFullName(srcFolderPath, srcFolderName) == FALSE) { return RETURN_CPYFOLDER_SRCFOLDERNAMEERROR; } // 在目标目录下创建源文件夹 MString fixDstFolderPath = dstFolderPath + _T("//") + srcFolderName; ::CreateDirectory(fixDstFolderPath.c_str(), NULL); // 得到搜索文件名 MString searchFileName = srcFolderPath + _T("//*.*"); // 查找第一文件 WIN32_FIND_DATA wfd; memset(&wfd, 0, sizeof(wfd)); HANDLE hFind = FindFirstFile(searchFileName.c_str(), &wfd); // 记录找到的文件 MString findFileName; MString dstFileName; // 记录返回值(主要记录磁盘空间不足的错误情况) RETURN_CPYFILE_T retValue = RETURN_CPYFOLDER_SUCCESS; // 找到文件,开始遍历 if (hFind != INVALID_HANDLE_VALUE) { DWORD dwAttrs = 0; // 保存文件属性 do { // 得到找到的文件绝对路径 findFileName = srcFolderPath + _T("//") + wfd.cFileName; dstFileName = fixDstFolderPath + _T("//") + wfd.cFileName; // 得到文件属性 dwAttrs = GetFileAttributes(findFileName.c_str()); // 是有效的属性 if (dwAttrs != INVALID_FILE_ATTRIBUTES) { // 不是隐藏文件,或是隐藏文件且处理隐藏文件 if ((!((dwAttrs) & FILE_ATTRIBUTE_HIDDEN)) || (((dwAttrs) & FILE_ATTRIBUTE_HIDDEN) && bCpyHideFile==TRUE)) { // 是文件夹 if ((dwAttrs) & FILE_ATTRIBUTE_DIRECTORY) { // 拷贝该文件夹 CopyFolderToFolder(findFileName, fixDstFolderPath, bOverlap, blPerfect, bCpyHideFile, ProgressFunc, pCurrentCopyFileCounts, totalFileCounts); } // 是文件 else { // 目标文件为只读文件且存在 if (bOverlap==TRUE && blPerfect==TRUE) { if (FileIsReadOnly(dstFileName) == TRUE) { ::SetFileAttributes(dstFileName.c_str(), FILE_ATTRIBUTE_NORMAL); } } // 判断空间是否足够 if (EnoughSpaceForFile(findFileName, fixDstFolderPath) == TRUE) { // 增加已经拷贝的文件数量 if (pCurrentCopyFileCounts != NULL) { (*pCurrentCopyFileCounts) += 1; } // 执行回调函数 if (ProgressFunc != NULL) { ProgressFunc(findFileName, *pCurrentCopyFileCounts, totalFileCounts); } ::CopyFile(findFileName.c_str(), dstFileName.c_str(), !bOverlap); } // 剩余空间不够 else { retValue = RETURN_CPYFOLDER_NOENOUGHSPACE; break; } } } } // 清除上次内容 memset(&wfd, 0, sizeof(wfd)); } while (FindNextFile(hFind, &wfd) != 0); // 关闭查询 FindClose(hFind); } return retValue; } // 拷贝文件夹到文件夹[支持进度显示回调函数](bOverlap表示是否覆盖原有文件,默认为覆盖,blPerfect==TRUE表示覆盖只读文件,否则不覆盖只读文件) RETURN_CPYFILE_T CopyFolderToFolderShowProgress(const MString &srcFolderPath, const MString &dstFolderPath, BOOL bOverlap, BOOL blPerfect, BOOL bCpyHideFile, PROGRESSCALLBACK ProgressFunc) { // 计算文件总数量 long fileTotalCounts = GetDirFileCounts(srcFolderPath, bCpyHideFile); // 记录当前已经拷贝文件数量 long currentCopyFileCounts = 0; // 返回拷贝文件夹 return CopyFolderToFolder(srcFolderPath, dstFolderPath, bOverlap, blPerfect, bCpyHideFile, ProgressFunc, ¤tCopyFileCounts, fileTotalCounts); } // 路径是否在文件夹下 BOOL PathInDir(const MString &pathName, const MString &dirPathName) { // 路径是否有效 if (PathNameEffective(pathName)==FALSE || PathNameEffective(dirPathName)==FALSE) { return FALSE; } // 先比较长度 if (pathName.length() < dirPathName.length()) { return FALSE; } else if (pathName.length() == dirPathName.length()) { if (wcsicmp(pathName.c_str(), dirPathName.c_str()) == 0) { return TRUE; } } // 文件名称比源路径长度长的情况 // 取得文件父路径 MString currentPath = pathName; MString parentDir = L""; GetFilePath(currentPath, parentDir); while (parentDir != L"//") { if (parentDir.length() < dirPathName.length()) { return FALSE; } else if (parentDir.length() == dirPathName.length()) { if (wcsicmp(parentDir.c_str(), dirPathName.c_str()) == 0) { return TRUE; } } else { currentPath = parentDir; GetFilePath(currentPath, parentDir); } } return FALSE; } // 取得文件夹下文件总数 long GetDirFileCounts(const MString &dirPathName, BOOL bGetHideFile) { // 用于返回文件数量 long fileCounts = 0; // 是否文件夹 if (FileIsDirectory(dirPathName) == FALSE) { return fileCounts; } // 得到搜索文件名 MString searchFileName = dirPathName + _T("//*.*"); // 查找第一文件 WIN32_FIND_DATA wfd; memset(&wfd, 0, sizeof(wfd)); HANDLE hFind = FindFirstFile(searchFileName.c_str(), &wfd); // 记录找到的文件 MString findFileName; // 找到文件,开始遍历 if (hFind != INVALID_HANDLE_VALUE) { DWORD dwAttrs = 0; // 保存文件属性 do { // 得到找到的文件绝对路径 findFileName = dirPathName + _T("//") + wfd.cFileName; // 得到文件属性 dwAttrs = GetFileAttributes(findFileName.c_str()); // 是有效的属性 if (dwAttrs != INVALID_FILE_ATTRIBUTES) { // 不是隐藏文件,或是隐藏文件且处理隐藏文件 if ((!((dwAttrs) & FILE_ATTRIBUTE_HIDDEN)) || (((dwAttrs) & FILE_ATTRIBUTE_HIDDEN) && bGetHideFile==TRUE)) { // 是文件夹 if ((dwAttrs) & FILE_ATTRIBUTE_DIRECTORY) { fileCounts += GetDirFileCounts(findFileName, bGetHideFile); } // 是文件 else { fileCounts++; } } } // 清除上次内容 memset(&wfd, 0, sizeof(wfd)); } while (FindNextFile(hFind, &wfd) != 0); // 关闭查询 FindClose(hFind); } return fileCounts; } /******************************************************************** 函数名:GetDiskSpace 作者:zhangwf 日期:2010/01/15 功能:取得磁盘空间剩余容量以及总容量 参数:【输入】deviceName 磁盘名称 【输出】pSpareCapacity 带出剩余容量(单位:字节) 【输出】pTotalCapacity 带出磁盘总容量(单位:字节) 返回:类型(BOOL) TRUE-成功;FALSE-失败; 修改记录: *********************************************************************/ BOOL GetDiskSpace(const MString &deviceName, ULONGLONG *pSpareCapacity, ULONGLONG *pTotalCapacity) { ULARGE_INTEGER FreeBytesAvailableToCaller; ULARGE_INTEGER TotalNumberOfBytes; ULARGE_INTEGER TotalNumberOfFreeBytes; if (GetDiskFreeSpaceExW(deviceName.c_str(), &FreeBytesAvailableToCaller, &TotalNumberOfBytes, &TotalNumberOfFreeBytes) == FALSE) { return FALSE; } // 取得剩余容量和总容量 if (pSpareCapacity != NULL) { *pSpareCapacity = TotalNumberOfFreeBytes.QuadPart; } if (pTotalCapacity != NULL) { *pTotalCapacity = TotalNumberOfBytes.QuadPart; } return TRUE; } // 判断目标路径磁盘是否有足够的空间存放当前文件 // 一定要确保参数的正确有效性,此处对于错误的参数都认为有足够的空间 BOOL EnoughSpaceForFile(const MString &filePathName, const MString &dstDirPath) { // 参数有效性 if (FileExist(filePathName) == FALSE) { return TRUE; } // 计算剩余空间大小(失败是因为目标路径传入错误,认为可以的,拷贝时会自动过滤掉) ULONGLONG spareCapacity = 0; if (GetDiskSpace(dstDirPath, &spareCapacity) == FALSE) { return TRUE; } // 计算文件大小 ULONGLONG fileSize = GetFileSize(filePathName); return (spareCapacity >= fileSize+1024*1024) ? TRUE : FALSE; }