这是早年写的代码,谨此记录吧。
//----------- Error Handling Function -------------------
void error(LPSTR lpszFunction)
{
CHAR szBuf[80];
DWORD dw = GetLastError();
sprintf(szBuf, "%s failed: GetLastError returned %u\n",
lpszFunction, dw);
MessageBox(NULL, CString(szBuf), _T("Error"), MB_OK);
ExitProcess(dw);
}
//--------------------------------------------------------
BOOL GetFileTime(HANDLE hFile, LPWSTR lpszCreationTime, LPWSTR lpszLastAccessTime, LPWSTR lpszLastWriteTime)
{
FILETIME ftCreate, ftAccess, ftWrite;
SYSTEMTIME stUTC1, stLocal1, stUTC2, stLocal2, stUTC3, stLocal3;
// -------->获取 FileTime
if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
{
error("GetFileTime()");
return FALSE;
}
//---------> 转换: FileTime --> LocalTime
FileTimeToSystemTime(&ftCreate, &stUTC1);
FileTimeToSystemTime(&ftAccess, &stUTC2);
FileTimeToSystemTime(&ftWrite, &stUTC3);
SystemTimeToTzSpecificLocalTime(NULL, &stUTC1, &stLocal1);
SystemTimeToTzSpecificLocalTime(NULL, &stUTC2, &stLocal2);
SystemTimeToTzSpecificLocalTime(NULL, &stUTC3, &stLocal3);
// ---------> Show the date and time.
wsprintf(lpszCreationTime, _T("%d%02d%02d-%02d%02d"),
stLocal1.wYear, stLocal1.wMonth, stLocal1.wDay,
stLocal1.wHour, stLocal1.wMinute);
wsprintf(lpszLastAccessTime, _T("%d%02d%02d-%02d%02d"),
stLocal2.wYear, stLocal2.wMonth, stLocal2.wDay,
stLocal2.wHour, stLocal2.wMinute);
wsprintf(lpszLastWriteTime, _T("%d%02d%"),stLocal3.wYear, stLocal3.wMonth);
return TRUE;
}
CString GetModifyTime(LPCWSTR strFilePath)
{
HANDLE hFile;
TCHAR szCreationTime[30], szLastAccessTime[30], szLastWriteTime[30];
hFile = CreateFile(strFilePath, 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
GetFileTime(hFile, szCreationTime, szLastAccessTime, szLastWriteTime);
if (hFile == INVALID_HANDLE_VALUE){
error("GetLastWriteTime()");
return 0;
}
CloseHandle(hFile);
return szLastWriteTime;
}
/******************************公共变量**********************************/
CString g_strDir;
ITaskbarList3* m_pTaskbarList;
CMutex g_Mutex;
std::map g_mLogs;
/************************************************************************/
int CClassifyFilesDlg::MoveFilesByTime(const char* pStr, const char* pSavePath, const int& nProcessIndex)
{
std::string strDir = CMfcStrFile::CString2Char(g_strDir);
std::string strRootDir = CStdStr::AddSlashIfNeeded(strDir);
if (_access(strRootDir.c_str(), 0) != 0)
{
if (!CreateDirectory(CString(strRootDir.c_str()), NULL))
{
return -1;
}
}
CString strLastWriteTime = GetModifyTime(CString(pStr));
std::string strYearMonth = std::string(CMfcStrFile::CString2Char(strLastWriteTime));
std::string strSaveDir = strRootDir + strYearMonth;
if (_access(strSaveDir.c_str(), 0) != 0)
{
if (!CreateDirectory(CString(strSaveDir.c_str()), NULL))
{
return -1;
}
}
std::string strSavePath = CStdStr::AddSlashIfNeeded(strSaveDir) + CStdStr::GetNameOfFile(pStr);
int nNum = 0;
if (CStdFile::IfAccessFile(strSavePath))
{
do
{
++nNum;
strSavePath = CStdStr::AddSlashIfNeeded(strSaveDir) + CStdStr::GetNameOfFile(pStr, false) + CStdTpl::ConvertToString(nNum) + CStdStr::GetSuffixOfFile(pStr);
} while (CStdFile::IfAccessFile(strSavePath));
}
if (rename(pStr, strSavePath.c_str()) < 0)
{
}
g_Mutex.Lock();
g_mLogs.insert(std::make_pair(std::string(pStr), strSavePath));
g_Mutex.Unlock();
return 0;
}
int CClassifyFilesDlg::MovePicsByTime(const char* pStr, const char* pSavePath, const int& nProcessIndex)
{
std::string strRootDir = CStdStr::AddSlashIfNeeded(CMfcStrFile::CString2Char(g_strDir));
if (_access(strRootDir.c_str(), 0) != 0)
{
if (!CreateDirectory(CString(strRootDir.c_str()), NULL))
{
return -1;
}
}
std::string strPicTime;
std::string strYearMonth;
if (Get_ExifTime(pStr, strPicTime))
{
strYearMonth = strPicTime.substr(0, 7);
strYearMonth = CStdStr::TrimAll(strYearMonth, ':');
}
else
{
CString strLastWriteTime = GetModifyTime(CString(pStr));
strYearMonth = std::string(CMfcStrFile::CString2Char(strLastWriteTime));
}
std::string strSaveDir = strRootDir + strYearMonth;
if (_access(strSaveDir.c_str(), 0) != 0)
{
if (!CreateDirectory(CString(strSaveDir.c_str()), NULL))
{
return -1;
}
}
std::string strSavePath = CStdStr::AddSlashIfNeeded(strSaveDir) + CStdStr::GetNameOfFile(pStr);
if (CStdFile::IfAccessFile(strSavePath))
{
int nNum = 0;
do
{
++nNum;
strSavePath = CStdStr::AddSlashIfNeeded(strSaveDir) + CStdStr::GetNameOfFile(pStr, false) + CStdTpl::ConvertToString(nNum) + CStdStr::GetSuffixOfFile(pStr);
} while (CStdFile::IfAccessFile(strSavePath));
}
if (strSavePath != std::string(pStr))
{
rename(pStr, strSavePath.c_str());
}
g_Mutex.Lock();
g_mLogs.insert(std::make_pair(std::string(pStr), strSavePath));
g_Mutex.Unlock();
return 0;
}
int CClassifyFilesDlg::RestoreFile(const char* pStr, const char* pSavePath, const int& nProcessIndex)
{
std::string strOldPath = g_mLogs[std::string(pStr)];
std::string strOldDir = CStdStr::GetDirOfFile(strOldPath);
if (_access(strOldDir.c_str(), 0) != 0)
{
CStdDir::CreateDir(strOldDir);
}
if (strOldPath != std::string(pStr))
{
rename(pStr, strOldPath.c_str());
}
return 0;
}
更多的交流,欢迎留言。