QT批拷贝文件

    技术2022-05-20  61

       今天把前段时间用到的批拷贝文件接口在QT中实现,其中也就是大量使用Window API,整个过程几乎不存在什么问题。但还是有让人不解的地方:

      1、但有一点浪费了我大量的时间,我开始一直是边调试边做。奇怪的是很简单的_tcscpy()函数的调用都失败,编译是没有错误的,但通过window查看TCHAR数组的值时,却是空。我很困惑,怎么会为空呢,一直以为是我的用法不对。改来改去都不行,后来在别处试了试,原来是调试窗口中追踪值没有追踪到。因为其实我的字符数组中是有值的,运行下来是有效果的。哎,不知道QT的问题还是我哪里设错了,反正观察窗口中看见的和实际的是不一样的。

      2、又到了回调函数的问题,我原本想QT里边有信号和槽机制,理应可以不用回调了。但还是不行啊,信号和槽是针对QT里面的对象的,而我要emit信号的地方不是在QT的对象下。哎,可悲啊!想着就回调给自己的线程类吧,又要用到前面讲得如何回调C++的成员函数。又不能回调静态成员函数,因为静态成员函数没办法emit消息出去。只有考虑把类的this指针传出去了。这个明天再来继续实现吧。

    下面是批拷贝文件接口

      CFileDirectory.h

      #ifndef CFILEDIRECTORY_H #define CFILEDIRECTORY_H #define _UNICODE #include <windows.h> #include <tchar.h> #define DIR_SEP _T("//") #define WIDECARD _T("//*") typedef void (WINAPI *LPCopyProgressRoutine)(DWORD, DWORD, DWORD, LPCTSTR); typedef struct _TFileInfo { TCHAR szFilePath[MAX_PATH + 16]; WIN32_FIND_DATA findData; }TFileInfo; class CFileDirectory { public: CFileDirectory(LPCTSTR lpSrcDirName, LPCTSTR lpDestDirName):m_NumOfFiles(0),m_NumOfDirs(0),m_NumOfFileTransferred(0) { if(!lpSrcDirName || !lpDestDirName) { return; } memset(&m_SrcFileInfo, 0, sizeof(m_SrcFileInfo)); memset(&m_DestFileInfo, 0, sizeof(m_DestFileInfo)); memset(m_strFilePathNameTransferred, 0, sizeof(m_strFilePathNameTransferred)); wcscpy(m_SrcFileInfo.szFilePath, lpSrcDirName); wcscpy(m_DestFileInfo.szFilePath, lpDestDirName); } virtual ~CFileDirectory(); public: DWORD GetNumOfDirs(); DWORD GetNumOfFiles(); BOOL CopyDirEx(LPCopyProgressRoutine lpCopyProgressRoutine); //BOOL DeleteDirs(); VOID ClearCounter(); private: BOOL CopyDirs(LPCopyProgressRoutine lpCopyProgressRoutine); BOOL Copys(LPCopyProgressRoutine lpCopyProgressRoutine); private: TFileInfo m_SrcFileInfo; TFileInfo m_DestFileInfo; TCHAR m_strFilePathNameTransferred[MAX_PATH]; DWORD m_NumOfFiles; DWORD m_NumOfDirs; DWORD m_NumOfFileTransferred; DWORD m_sizeOfAllFiles; }; #endif // CFILEDIRECTORY_H

     

    CFileDirectory.cpp

    #include "CFileDirectory.h" DWORD CFileDirectory::GetNumOfFiles() { size_t SrcPathLength = _tcslen(m_SrcFileInfo.szFilePath); if(0 == _tcsicmp(&m_SrcFileInfo.szFilePath[SrcPathLength - 1], DIR_SEP)) { m_SrcFileInfo.szFilePath[SrcPathLength - 1] = 0; } DWORD searchPathLength = _tcslen(m_SrcFileInfo.szFilePath); _tcscpy(&m_SrcFileInfo.szFilePath[searchPathLength], WIDECARD); HANDLE findFile = FindFirstFile(m_SrcFileInfo.szFilePath, &m_SrcFileInfo.findData); if(findFile == INVALID_HANDLE_VALUE) return 0; do { DWORD filenameLength = 0; if((_tcsicmp(m_SrcFileInfo.findData.cFileName, L".") != 0) && (_tcsicmp(m_SrcFileInfo.findData.cFileName, L"..") != 0)) { filenameLength = _tcslen(m_SrcFileInfo.findData.cFileName); _tcscpy(&m_SrcFileInfo.szFilePath[searchPathLength], DIR_SEP); _tcscpy(&m_SrcFileInfo.szFilePath[searchPathLength + 1], m_SrcFileInfo.findData.cFileName); } if(m_SrcFileInfo.findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if((_tcsicmp(m_SrcFileInfo.findData.cFileName, L".") != 0) && (_tcsicmp(m_SrcFileInfo.findData.cFileName, L"..") != 0)) { m_NumOfFiles++; GetNumOfFiles(); m_SrcFileInfo.szFilePath[searchPathLength + filenameLength] = 0; } } else {} }while(FindNextFile(findFile, &m_SrcFileInfo.findData)); FindClose(findFile); m_SrcFileInfo.szFilePath[searchPathLength] = 0; return m_NumOfFiles; } DWORD CFileDirectory::GetNumOfDirs() { size_t SrcPathLength = _tcslen(m_SrcFileInfo.szFilePath); if(0 == _tcsicmp(&m_SrcFileInfo.szFilePath[SrcPathLength - 1], DIR_SEP)) { m_SrcFileInfo.szFilePath[SrcPathLength - 1] = 0; } DWORD searchPathLength = _tcslen(m_SrcFileInfo.szFilePath); _tcscpy(&m_SrcFileInfo.szFilePath[searchPathLength - 1], WIDECARD); HANDLE findFile = ::FindFirstFile(m_SrcFileInfo.szFilePath, &m_SrcFileInfo.findData); if(findFile == INVALID_HANDLE_VALUE) { return 0; } do { DWORD filenameLength = 0; if((_tcsicmp(m_SrcFileInfo.findData.cFileName, L".") != 0) && (_tcsicmp(m_SrcFileInfo.findData.cFileName, L"..") != 0)) { filenameLength = _tcslen(m_SrcFileInfo.findData.cFileName); _tcscpy(&m_SrcFileInfo.szFilePath[searchPathLength], DIR_SEP); _tcscpy(&m_SrcFileInfo.szFilePath[searchPathLength + 1], m_SrcFileInfo.findData.cFileName); } if(m_SrcFileInfo.findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if((_tcsicmp(m_SrcFileInfo.findData.cFileName, L".") != 0) && (_tcsicmp(m_SrcFileInfo.findData.cFileName, L"..") != 0)) GetNumOfDirs(); } else { m_NumOfDirs++; } }while(::FindNextFile(findFile, &m_SrcFileInfo.findData)); FindClose(findFile); m_SrcFileInfo.szFilePath[searchPathLength] = 0; return m_NumOfDirs; } BOOL CFileDirectory::CopyDirEx(LPCopyProgressRoutine lpCopyProgressRoutine) { HANDLE findfile = FindFirstFile(m_SrcFileInfo.szFilePath, &m_SrcFileInfo.findData); if(findfile == INVALID_HANDLE_VALUE) { return FALSE; } if(m_SrcFileInfo.findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { FindClose(findfile); CopyDirs(lpCopyProgressRoutine); } else { FindClose(findfile); Copys(lpCopyProgressRoutine); } return true; } BOOL CFileDirectory::Copys(LPCopyProgressRoutine lpCopyProgressRoutine) { HANDLE findFile = FindFirstFile(m_DestFileInfo.szFilePath, &m_DestFileInfo.findData); if(INVALID_HANDLE_VALUE == findFile) { if(!CreateDirectory(m_DestFileInfo.szFilePath, NULL)) { DWORD dwError = GetLastError(); if(ERROR_PATH_NOT_FOUND == dwError) return FALSE; } } DWORD dwSrcAttribute = GetFileAttributes(m_SrcFileInfo.szFilePath); if(dwSrcAttribute & FILE_ATTRIBUTE_READONLY) { dwSrcAttribute = dwSrcAttribute & (~FILE_ATTRIBUTE_READONLY); if(!SetFileAttributes(m_DestFileInfo.szFilePath, dwSrcAttribute)) { } } DWORD SrcPathLength = _tcslen(m_SrcFileInfo.szFilePath); if(0 == _tcsicmp(&m_SrcFileInfo.szFilePath[SrcPathLength -1], DIR_SEP)) { m_SrcFileInfo.szFilePath[SrcPathLength - 1] = 0; } DWORD DestPathLength = _tcslen(m_DestFileInfo.szFilePath); if(0 == _tcsicmp(&m_DestFileInfo.szFilePath[DestPathLength - 1], DIR_SEP)) { m_DestFileInfo.szFilePath[DestPathLength - 1] = 0; } LPTSTR p = _tcsrchr(m_SrcFileInfo.szFilePath, L'//'); _tcscat(m_DestFileInfo.szFilePath, p); dwSrcAttribute = GetFileAttributes(m_SrcFileInfo.szFilePath); if(dwSrcAttribute & FILE_ATTRIBUTE_READONLY) { dwSrcAttribute = dwSrcAttribute & (~FILE_ATTRIBUTE_READONLY); if(!SetFileAttributes(m_DestFileInfo.szFilePath, dwSrcAttribute)) { } } if(dwSrcAttribute & FILE_ATTRIBUTE_HIDDEN) { SetFileAttributes(m_DestFileInfo.szFilePath, (dwSrcAttribute & ~FILE_ATTRIBUTE_HIDDEN)); } if(!CopyFileEx(m_SrcFileInfo.szFilePath, m_DestFileInfo.szFilePath, NULL, NULL, false, COPY_FILE_RESTARTABLE)) { DWORD dwError = GetLastError(); _tprintf(L"SourcePath = %s, DestPath = %s, Error = %d", m_SrcFileInfo.szFilePath, m_DestFileInfo.szFilePath, dwError); } else { m_NumOfFileTransferred++; _stprintf(m_strFilePathNameTransferred, L"%s", m_DestFileInfo.szFilePath); if(lpCopyProgressRutine != NULL) lpCopyProgressRutine(m_NumOfDirs, m_NumOfFiles, m_NumOfFileTransferred, m_strFilePathNameTransferred); } FindClose(findFile); return true; } BOOL CFileDirectory::CopyDirs(LPCopyProgressRoutine lpCopyProgressRoutine) { HANDLE findFile = FindFirstFile(m_DestFileInfo.szFilePath, &m_DestFileInfo.findData); if(INVALID_HANDLE_VALUE == findFile) { if(!CreateDirectory(m_DestFileInfo.szFilePath, NULL)) { DWORD dwError = GetLastError(); if(ERROR_PATH_NOT_FOUND == dwError) return FALSE; } } DWORD dwSrcAttribute = GetFileAttributes(m_SrcFileInfo.szFilePath); if(dwSrcAttribute & FILE_ATTRIBUTE_READONLY) { dwSrcAttribute = dwSrcAttribute & (~FILE_ATTRIBUTE_READONLY); if(!SetFileAttributes(m_DestFileInfo.szFilePath, dwSrcAttribute)) { } } DWORD SrcPathLength = _tcslen(m_SrcFileInfo.szFilePath); if(0 == _tcsicmp(&m_SrcFileInfo.szFilePath[SrcPathLength -1], DIR_SEP)) { m_SrcFileInfo.szFilePath[SrcPathLength - 1] = 0; } DWORD DestPathLength = _tcslen(m_DestFileInfo.szFilePath); if(0 == _tcsicmp(&m_DestFileInfo.szFilePath[DestPathLength - 1], DIR_SEP)) { m_DestFileInfo.szFilePath[DestPathLength - 1] = 0; } DWORD searchSrcPathLength = _tcslen(m_SrcFileInfo.szFilePath); _tcscpy(&m_SrcFileInfo.szFilePath[searchSrcPathLength], WIDECARD); DWORD searchDestPathLength = _tcslen(m_DestFileInfo.szFilePath); findFile = FindFirstFile(m_SrcFileInfo.szFilePath, &m_SrcFileInfo.findData); if(INVALID_HANDLE_VALUE == findFile) { return FALSE; } do { DWORD filenamelength = 0; if((_tcsicmp(m_SrcFileInfo.findData.cFileName, L".") != 0) && (_tcsicmp(m_SrcFileInfo.findData.cFileName, L"..") != 0)) { filenamelength = _tcslen(m_SrcFileInfo.findData.cFileName); _tcscpy(&m_SrcFileInfo.szFilePath[searchSrcPathLength], DIR_SEP); _tcscpy(&m_SrcFileInfo.szFilePath[searchSrcPathLength + 1], m_SrcFileInfo.findData.cFileName); _tcscpy(&m_DestFileInfo.szFilePath[searchDestPathLength], DIR_SEP); _tcscpy(&m_DestFileInfo.szFilePath[searchDestPathLength + 1], m_SrcFileInfo.findData.cFileName); } if(m_SrcFileInfo.findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if((_tcsicmp(m_SrcFileInfo.findData.cFileName, L".") != 0) && (_tcsicmp(m_SrcFileInfo.findData.cFileName, L"..") != 0)) CopyDirs(); } else { DWORD dwSrcAttribute = GetFileAttributes(m_SrcFileInfo.szFilePath); if(dwSrcAttribute & FILE_ATTRIBUTE_READONLY) { dwSrcAttribute = dwSrcAttribute & (~FILE_ATTRIBUTE_READONLY); if(!SetFileAttributes(m_DestFileInfo.szFilePath, dwSrcAttribute)) { } } if(dwSrcAttribute & FILE_ATTRIBUTE_HIDDEN) { SetFileAttributes(m_DestFileInfo.szFilePath, (dwSrcAttribute & ~FILE_ATTRIBUTE_HIDDEN)); } if(!CopyFileEx(m_SrcFileInfo.szFilePath, m_DestFileInfo.szFilePath, NULL, NULL, false, COPY_FILE_RESTARTABLE)) { DWORD dwError = GetLastError(); _tprintf(L"SourcePath = %s, DestPath = %s, Error = %d", m_SrcFileInfo.szFilePath, m_DestFileInfo.szFilePath, dwError); } else { m_NumOfFileTransferred++; _stprintf(m_strFilePathNameTransferred, L"%s", m_DestFileInfo.szFilePath); if(lpCopyProgressRutine != NULL) lpCopyProgressRutine(m_NumOfDirs, m_NumOfFiles, m_NumOfFileTransferred, m_strFilePathNameTransferred); } } }while(FindNextFile(findFile, &m_SrcFileInfo.findData)); FindClose(findFile); m_SrcFileInfo.szFilePath[searchSrcPathLength] = 0; m_DestFileInfo.szFilePath[searchDestPathLength] = 0; return TRUE; } CFileDirectory::~CFileDirectory() { }

     

     

    QString向TCHAR*的转变reinterpret_cast<const wchar_t*>(SrcPath.utf16());使用接口把QString转变为TCHAR*就可。

     

     

      


    最新回复(0)