2019年8月

删除历史日志的一个API

bool DeleteOldFiles(const char* strFolder, const char* strPrefix, boolis_recursion, UINT32 ulMinDateTime, UINT32 ulMaxDateTime)
{
HANDLE hFind
=NULL;
WIN32_FIND_DATAA findFileData;
std::
string strFindFolder =strFolder;//转换成大写的进行比较 std::string strUpperPrefix = str_toupper(std::string(strPrefix));
std::
string strUpperFileName(MAX_PATH, '\0');
std::
string strTempName(MAX_PATH, '\0');if (strFindFolder[strFindFolder.length() - 1] == '\\') {
strFindFolder.append(
"*.*");
}
else{
strFindFolder.append(
"\\*.*");
}

hFind
= FindFirstFileA(strFindFolder.c_str(), &findFileData);if (hFind ==INVALID_HANDLE_VALUE)
{
return false;
}
do{if ((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ==FILE_ATTRIBUTE_DIRECTORY) {if(is_recursion){if ((0 == strcmp(".", findFileData.cFileName)) || (0 == strcmp("..", findFileData.cFileName)))
{
continue;
}

sprintf_s(
&strTempName[0], MAX_PATH - 1, "%s\\%s", strFolder, findFileData.cFileName);

DeleteOldFiles(strTempName.c_str(), strPrefix, is_recursion, ulMinDateTime, ulMaxDateTime);
}
}
else{//判断文件名是否相同的前缀 strUpperFileName = str_toupper(std::string(findFileData.cFileName));//有相同的前缀 if (strcmp(strUpperFileName.c_str(), strUpperPrefix.c_str()) >=0) {//取当前指定位置的数值,转换成整数 UINT32 ulCurrDateTime = atoi(&strUpperFileName[strUpperPrefix.length()]);if ((ulCurrDateTime >= ulMinDateTime) && (ulCurrDateTime <=ulMaxDateTime)) {//组合文件名 sprintf_s(&strTempName[0], MAX_PATH - 1, "%s\\%s", strFolder, findFileData.cFileName);//删除文件 DeleteFileA(strTempName.c_str());
}
}
}
}
while (FindNextFileA(hFind, &findFileData));
::FindClose(hFind);
hFind
=NULL;return true;
}

 

/******************************************************** 
* @file : Mutex.h
* @desc : 同步对象
* @author :
* @date : 2019-7-30
* @version : 1.0.0
********************************************************
*/#ifndef UTILITY_MUTEX_H_#define UTILITY_MUTEX_H_#include"UtilityDef.h"#ifdef WIN32
typedef CRITICAL_SECTION thread_mutex;
#elsetypedef pthread_mutex_t thread_mutex;#endif classUTILITY_API CThreadMutex final {public:
CThreadMutex() {
#ifdef WIN32
InitializeCriticalSection(
&mutex_);#elsepthread_mutex_init(&mutex_, nullptr);#endif}~CThreadMutex(){
#ifdef WIN32
DeleteCriticalSection(
&mutex_);#elsepthread_mutex_destroy(&mutex_);#endif}void lock() {
is_lock_
= true;
#ifdef WIN32
EnterCriticalSection(
&mutex_);#elsepthread_mutex_lock(&mutex);#endif}voidunlock(){
is_lock_
= false;
#ifdef WIN32
LeaveCriticalSection(
&mutex_);#elsepthread_mutex_unlock(&mutex_);#endif}bool islock()const{returnis_lock_;
}

thread_mutex
* get(){return &mutex_;
}
private:
thread_mutex mutex_;
volatile boolis_lock_;
};
classUTILITY_API CAutoThreadMutex final {public:explicit CAutoThreadMutex(CThreadMutex*mutex_ptr): mutex_(mutex_ptr) {lock();
}
~CAutoThreadMutex() {
unlock();
}
void lock() {if(mutex_){
mutex_
->lock();
}
}
voidunlock() {if(mutex_ && mutex_->islock()) {
mutex_
->unlock();
}
}

thread_mutex
* get() {return mutex_->get();
}
protected:
CAutoThreadMutex(
const CAutoThreadMutex&rhs) {
mutex_
=rhs.mutex_;lock();
}

CAutoThreadMutex
& operator=(const CAutoThreadMutex&rhs){if(this == &rhs){return *this;
}

mutex_
=rhs.mutex_;return *this;
}
private:
CThreadMutex
*mutex_;
};
#endif