luo 2 年之前
当前提交
101e1db436
共有 9 个文件被更改,包括 950 次插入0 次删除
  1. 11 0
      AnyCleaner.h
  2. 25 0
      AnyCleaner.sln
  3. 173 0
      AnyCleaner.vcxproj
  4. 48 0
      AnyCleaner.vcxproj.filters
  5. 4 0
      AnyCleaner.vcxproj.user
  6. 35 0
      AnyClearnerMain.cpp
  7. 535 0
      RtpFilesCleaner.cpp
  8. 112 0
      RtpFilesCleaner.h
  9. 7 0
      anycleaner.cfg

+ 11 - 0
AnyCleaner.h

@@ -0,0 +1,11 @@
+#pragma once
+
+#include "AppLog.h"
+#include "CSysFormat.h"
+#define APPLOG_NAME "AnyCleaner"
+
+
+
+#define BLOG_DEBUG(msg) LOG4CXX_INFO(app_logger, msg); 
+#define BLOG_ERROR(msg) LOG4CXX_ERROR(app_logger, msg); 
+#define BLOG_WARN(msg) LOG4CXX_WARN(app_logger, msg); 

+ 25 - 0
AnyCleaner.sln

@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.34114.132
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AnyCleaner", "AnyCleaner.vcxproj", "{3BFD3405-EF1C-4604-B063-DF18EF90D2E5}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|x64 = Debug|x64
+		Release|x64 = Release|x64
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{3BFD3405-EF1C-4604-B063-DF18EF90D2E5}.Debug|x64.ActiveCfg = Debug|x64
+		{3BFD3405-EF1C-4604-B063-DF18EF90D2E5}.Debug|x64.Build.0 = Debug|x64
+		{3BFD3405-EF1C-4604-B063-DF18EF90D2E5}.Release|x64.ActiveCfg = Release|x64
+		{3BFD3405-EF1C-4604-B063-DF18EF90D2E5}.Release|x64.Build.0 = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {6DD69E85-ECB7-41CD-9AA9-AAA568E30B3C}
+	EndGlobalSection
+EndGlobal

+ 173 - 0
AnyCleaner.vcxproj

@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\cvs\IOIUtils\CAppLife.cpp" />
+    <ClCompile Include="..\cvs\IOIUtils\CDiscHelper.cpp" />
+    <ClCompile Include="..\cvs\IOIUtils\TSysThread.cpp" />
+    <ClCompile Include="..\cvs\SysUtils\AppLog.cpp" />
+    <ClCompile Include="..\cvs\SysUtils\bbLogging.cpp" />
+    <ClCompile Include="..\cvs\SysUtils\CSysFormat.cpp" />
+    <ClCompile Include="AnyClearnerMain.cpp" />
+    <ClCompile Include="RtpFilesCleaner.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="AnyCleaner.h" />
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>16.0</VCProjectVersion>
+    <Keyword>Win32Proj</Keyword>
+    <ProjectGuid>{3bfd3405-ef1c-4604-b063-df18ef90d2e5}</ProjectGuid>
+    <RootNamespace>AnyCleaner</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v142</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+    <OutDir>$(ProjectDir)$(PlatformToolset)\$(PlatformTarget)\$(Configuration)\</OutDir>
+    <IntDir>$(PlatformToolset)\$(PlatformTarget)\$(Configuration)\$(ProjectName)</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+    <OutDir>$(ProjectDir)$(PlatformToolset)\$(PlatformTarget)\$(Configuration)\</OutDir>
+    <IntDir>$(PlatformToolset)\$(PlatformTarget)\$(Configuration)\$(ProjectName)</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+    <OutDir>$(ProjectDir)$(PlatformToolset)\$(PlatformTarget)\$(Configuration)\</OutDir>
+    <IntDir>$(PlatformToolset)\$(PlatformTarget)\$(Configuration)\$(ProjectName)</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+    <OutDir>$(ProjectDir)$(PlatformToolset)\$(PlatformTarget)\$(Configuration)\</OutDir>
+    <IntDir>$(PlatformToolset)\$(PlatformTarget)\$(Configuration)\$(ProjectName)</IntDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <AdditionalIncludeDirectories>.\;..\..\cvs\DeviceSDKs\liblog4cxx\include;..\..\cvs\DeviceSDKs\libconfig\include;..\..\cvs\SysUtils;..\..\cvs\IOIUtils</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalLibraryDirectories>..\..\cvs\DeviceSDKs\liblog4cxx\lib\$(PlatformTarget);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <AdditionalIncludeDirectories>.\;..\..\cvs\DeviceSDKs\liblog4cxx\include;..\..\cvs\DeviceSDKs\libconfig\include;..\..\cvs\SysUtils;..\..\cvs\IOIUtils</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalLibraryDirectories>..\..\cvs\DeviceSDKs\liblog4cxx\lib\$(PlatformTarget);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <AdditionalIncludeDirectories>..\cvs\DeviceSDKs\libglog\include;..\cvs\DeviceSDKs\liblog4cxx\include;..\cvs\SysUtils;..\cvs\IOIUtils</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalLibraryDirectories>..\cvs\DeviceSDKs\liblog4cxx\lib\$(PlatformTarget);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <ConformanceMode>true</ConformanceMode>
+      <AdditionalIncludeDirectories>..\cvs\DeviceSDKs\libglog\include;..\cvs\DeviceSDKs\liblog4cxx\include;..\cvs\SysUtils;..\cvs\IOIUtils</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalLibraryDirectories>..\cvs\DeviceSDKs\liblog4cxx\lib\$(PlatformTarget);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+    </Link>
+  </ItemDefinitionGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>

+ 48 - 0
AnyCleaner.vcxproj.filters

@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="RtpFilesCleaner.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="AnyClearnerMain.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\cvs\IOIUtils\CAppLife.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\cvs\IOIUtils\CDiscHelper.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\cvs\IOIUtils\TSysThread.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\cvs\SysUtils\AppLog.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\cvs\SysUtils\bbLogging.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\cvs\SysUtils\CSysFormat.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="AnyCleaner.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>

+ 4 - 0
AnyCleaner.vcxproj.user

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup />
+</Project>

+ 35 - 0
AnyClearnerMain.cpp

@@ -0,0 +1,35 @@
+#include "AnyCleaner.h"
+#include "RtpFilesCleaner.h"
+
+#ifdef _DEBUG
+	#pragma comment (lib, "log4cxxd.lib")
+	#pragma comment (lib, "ws2_32.lib")//shlwapi
+	#pragma comment (lib, "shlwapi.lib")
+
+#else
+	#pragma comment (lib, "log4cxx.lib")
+	#pragma comment (lib, "ws2_32.lib")
+	#pragma comment (lib, "shlwapi.lib")
+
+#endif
+
+log4cxx::LoggerPtr app_logger(log4cxx::Logger::getLogger(APPLOG_NAME));
+
+int main()
+{
+	AppLogConfigure(nullptr, APPLOG_NAME, APPLOG_NAME);
+
+    ClearRtpFiles rtpfiles_cleaner;
+	if (!rtpfiles_cleaner.LoadDeviceInfo()) {
+		return -1;
+	}
+
+	rtpfiles_cleaner.init();
+
+	BLOG_DEBUG(fmt::format("App start"));
+	while (true) {
+		Sleep(1000);
+	}
+
+	return 0;
+}

+ 535 - 0
RtpFilesCleaner.cpp

@@ -0,0 +1,535 @@
+#define _CRT_SECURE_NO_WARNINGS
+
+#include <tchar.h>
+#include <Shlwapi.h>
+
+#include "AnyCleaner.h"
+
+#include "RtpFilesCleaner.h"
+
+#include "json.h"
+#include "RtpFast.h"
+
+
+
+//#include "CRtpFrame.h"
+
+
+ClearRtpFiles::ClearRtpFiles()
+{
+	//Start();
+}
+
+ClearRtpFiles::~ClearRtpFiles()
+{
+	Stop();
+	std::list<RTPFILEDESC*>::iterator iter;
+	for (iter = list_src_rtpfiles.begin(); iter != list_src_rtpfiles.end();) {
+		delete (*iter);
+		*iter = NULL;
+		iter = list_src_rtpfiles.erase(iter);
+	}
+	list_src_rtpfiles.clear();
+	for (iter = list_backup_rtpfiles.begin(); iter != list_backup_rtpfiles.end();) {
+		delete (*iter);
+		*iter = NULL;
+		iter = list_backup_rtpfiles.erase(iter);
+	}
+	list_backup_rtpfiles.clear();
+}
+
+
+
+bool ClearRtpFiles::LoadDeviceInfo()
+{
+	char* text = NULL;
+	
+	FILE* pf = fopen("anycleaner.cfg", "rb+");
+	if (!pf) {
+		BLOG_ERROR("open anycleaner.cfg failed");
+		//printf("open deveice.config failed\n");
+		return false;
+	}
+	fseek(pf, 0, SEEK_END);
+	long lSize = ftell(pf);
+	text = (char*)malloc(lSize);
+	rewind(pf);
+	fread(text, sizeof(char), lSize, pf);
+	std::string filedata = std::string(text, lSize);
+	free(text);
+	fclose(pf);
+
+	nlohmann::json j = nlohmann::json::parse(filedata);
+	std::string src = j["duty_spool"];
+	src_path = src;
+
+	std::string backup = j["standby_spool"];
+	backup_path = backup;
+
+	checktime = j["check_interval"];
+	remaining_memory = j["storage_freespace"];
+
+	retension_day = j["retension_day"];
+	return true;
+}
+
+int ClearRtpFiles::Get_Channel_List(std::vector<char*>* pVecFolderName, char* folder_name)
+{
+	char fileFound[256];
+	WIN32_FIND_DATAA info;
+	HANDLE hp;
+	char* folder_path = NULL;
+
+	sprintf(fileFound, ("%s\\*.*"), folder_name);
+	hp = FindFirstFileA(fileFound, &info);
+
+	if (hp == INVALID_HANDLE_VALUE) return -1;
+
+	do {
+
+		if ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) continue;
+
+		// "."
+		if (info.cFileName[0] == '.' && info.cFileName[1] == '\0') continue;
+
+		// ".."
+		if (info.cFileName[0] == '.' && info.cFileName[1] == '.' && info.cFileName[2] == '\0') continue;
+
+		// find one directory
+		folder_path = new char[256];
+
+		if (!folder_path) break;
+
+		sprintf(folder_path, "%s\\%s", folder_name, info.cFileName);
+
+		pVecFolderName->push_back(folder_path);
+		folder_path = NULL;
+
+	} while (FindNextFileA(hp, &info));
+
+	FindClose(hp);
+
+	return 0;
+}
+
+int ClearRtpFiles::Get_Date_List(std::vector<char*>* pVecFolderName, char* folder_name)
+{
+	char fileFound[256];
+	WIN32_FIND_DATAA info;
+	HANDLE hp;
+	char* folder_path = NULL;
+
+	sprintf(fileFound, ("%s\\*.*"), folder_name);
+	hp = FindFirstFileA(fileFound, &info);
+
+	if (hp == INVALID_HANDLE_VALUE) return -1;
+
+	do {
+
+		if ((info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY) continue;
+
+		// "."
+		if (info.cFileName[0] == '.' && info.cFileName[1] == '\0') continue;
+
+		// ".."
+		if (info.cFileName[0] == '.' && info.cFileName[1] == '.' && info.cFileName[2] == '\0') continue;
+
+		// find one directory
+		folder_path = new char[256];
+
+		if (!folder_path) break;
+
+		sprintf(folder_path, "%s\\%s", folder_name, info.cFileName);
+
+		pVecFolderName->push_back(folder_path);
+		folder_path = NULL;
+
+	} while (FindNextFileA(hp, &info));
+
+	FindClose(hp);
+
+	return 0;
+}
+
+void ClearRtpFiles::Get_DateFiles(std::vector<char*>* vec_foldernames, const char* src_folder)
+{
+	char* curr_folder = new char[256];
+	memset(curr_folder, 0, 256);
+	sprintf(curr_folder, "%s", src_folder);
+	Get_Date_List(vec_foldernames, (char*)src_folder);
+}
+
+void ClearRtpFiles::Get_Channel(std::vector<char*>* vec_foldernames,const char* src_folder)
+{
+	char* curr_folder = new char[256];
+	memset(curr_folder,0,256);
+	sprintf(curr_folder, "%s", src_folder);
+	Get_Channel_List(vec_foldernames, (char*)src_folder);
+}
+
+int ClearRtpFiles::rtp_listfile(std::list<RTPFILEDESC*>* list_rtpfiles, const char* src_folder)
+{
+	std::vector<char*> vec_foldernames;
+
+	char* curr_folder = new char[256];
+	if (!curr_folder) {
+
+		//CONSOLELOG(ERROR) << "mem is not enough to process folder: " << src_folder;
+
+		return -1;
+	}
+	sprintf(curr_folder, "%s", src_folder);
+	vec_foldernames.push_back(curr_folder);
+
+	CDiscHelper::GetFolderName(&vec_foldernames, (char*)src_folder, true);
+
+	for (unsigned int f = 0; f < vec_foldernames.size(); f++) {
+
+		std::vector<char*> vec_filenames;
+
+		CDiscHelper::GetFileName(&vec_filenames, vec_foldernames.at(f));
+
+		if (vec_filenames.empty()) {
+
+			//CONSOLELOG(INFO) << "there is no files under folder: " << vec_foldernames.at(f);
+
+			continue;
+		}
+
+		// #process all the rtp files		
+		for (unsigned int v = 0; v < vec_filenames.size(); v++) {
+
+			if (!CDiscHelper::IsMatchExt(vec_filenames.at(v), (char*)".rtp")) continue; // ignore non rtp files
+
+			RTPFILEDESC* rtp_filedesc = new RTPFILEDESC;
+
+			if (!rtp_filedesc) {
+
+				//CONSOLELOG(ERROR) << "mem is limited to process more files.";
+
+				break;
+			}
+
+			memset(rtp_filedesc, 0, sizeof(*rtp_filedesc));
+
+			sprintf(rtp_filedesc->file_name, "%s", vec_filenames.at(v));
+
+			rtp_filedesc->file_size = CDiscHelper::GetFileSize(rtp_filedesc->file_name);
+			std::string srcdata = std::string(rtp_filedesc->file_name);
+			std::string data = srcdata;
+			while (true) {
+				if (data.npos != data.find("\\")) {
+					data = data.substr(data.find("\\") + 1);
+				}
+				else {
+					break;
+				}
+			}
+			rtp_filedesc->name = data;
+
+			char fold[100] = "";
+			memcpy(fold, srcdata.c_str(), srcdata.find(data) - 1);
+			data = std::string(fold);
+			while (true) {
+				if (data.npos != data.find("\\")) {
+					data = data.substr(data.find("\\") + 1);
+				}
+				else {
+					break;
+				}
+			}
+			memcpy(rtp_filedesc->folder, data.c_str(),data.size());
+			list_rtpfiles->push_back(rtp_filedesc);
+		}
+
+		CDiscHelper::ClearFolderName(&vec_filenames);
+	}
+
+	CDiscHelper::ClearFolderName(&vec_foldernames);
+
+	return 0;
+}
+
+std::wstring s2ws(const std::string& s) 
+{
+	int len; int slength = (int)s.length() + 1;
+	len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); wchar_t* buf = new wchar_t[len];
+	MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
+	std::wstring r(buf);
+	delete[] buf;
+	return r;
+}
+
+void ClearRtpFiles::Delete_file(std::string filename)
+{
+	{
+		std::string file = filename;
+		std::wstring stemp = s2ws(file);
+		LPCWSTR result = stemp.c_str();
+		BOOL del = DeleteFile(result);
+		if (!del) {
+			DWORD error_rus = GetLastError();
+			BLOG_DEBUG(fmt::format("[F] *** failed to DeleteFile {},code{} ***", file, error_rus));
+		}
+	}
+	{
+		std::string file = filename;
+		file += ".gop";
+		std::wstring stemp = s2ws(file);
+		LPCWSTR result = stemp.c_str();
+		BOOL del = DeleteFile(result);
+		if (!del) {
+			DWORD error_rus = GetLastError();
+			BLOG_DEBUG(fmt::format("[F] *** failed to DeleteFile {},code{} ***", file, error_rus));
+		}
+	}
+}
+
+int ClearRtpFiles::Identical_file_check()
+{
+	std::string src;
+	std::string back;
+
+	std::list<RTPFILEDESC*>::iterator iter = list_backup_rtpfiles.begin();
+	for (iter; iter != list_backup_rtpfiles.end();) {
+		back = std::string((*iter)->folder);
+		for (auto l : list_src_rtpfiles) {
+			src = std::string(l->folder);
+			if (back == src) {
+				if ((*iter)->name == l->name) {
+					//delete file
+					Delete_file((*iter)->file_name);
+				}
+			}
+		}
+		iter++;
+	}
+
+	for (iter = list_src_rtpfiles.begin(); iter != list_src_rtpfiles.end();) {
+		delete (*iter);
+		*iter = NULL;
+		iter = list_src_rtpfiles.erase(iter);
+	}
+	list_src_rtpfiles.clear();
+
+	for (iter = list_backup_rtpfiles.begin(); iter != list_backup_rtpfiles.end();) {
+		delete (*iter);
+		*iter = NULL;
+		iter = list_backup_rtpfiles.erase(iter);
+	}
+	list_backup_rtpfiles.clear();
+
+	return 0;
+}
+
+std::string get_Item(std::string src)
+{
+	std::string data = src;
+	while (true) {
+		if (data.npos != data.find("\\")) {
+			data = data.substr(data.find("\\") + 1);
+		}
+		else {
+			break;
+		}
+	}
+	return data;
+}
+
+/*通过调用ShFileOperation来实现整个目录的删除*/
+/*只删除单个目录*/
+BOOL ClearRtpFiles::SHDeleteFolder(std::string pstrFolder, BOOL bAllowUndo)
+{
+	std::string file = pstrFolder;
+	std::wstring stemp = s2ws(file);
+	LPCWSTR result = stemp.c_str();
+
+	int iPathLen = wcslen(result);
+	if (iPathLen >= MAX_PATH)
+	{
+		return FALSE;
+	}
+	/*确保目录的路径以2个\0结尾*/
+	TCHAR tczFolder[MAX_PATH + 1];
+	ZeroMemory(tczFolder, (MAX_PATH + 1) * sizeof(TCHAR));
+	wcscpy(tczFolder, result);
+	tczFolder[iPathLen] = _T('\0');
+	tczFolder[iPathLen + 1] = _T('\0');
+
+	SHFILEOPSTRUCT FileOp;
+	ZeroMemory(&FileOp, sizeof(SHFILEOPSTRUCT));
+	FileOp.fFlags |= FOF_SILENT;        /*不显示进度*/
+	FileOp.fFlags |= FOF_NOERRORUI;        /*不报告错误信息*/
+	FileOp.fFlags |= FOF_NOCONFIRMATION;/*直接删除,不进行确认*/
+	FileOp.hNameMappings = NULL;
+	FileOp.hwnd = NULL;
+	FileOp.lpszProgressTitle = NULL;
+	FileOp.wFunc = FO_DELETE;
+	FileOp.pFrom = tczFolder;            /*要删除的目录,必须以2个\0结尾*/
+	FileOp.pTo = NULL;
+
+	/*根据传递的bAllowUndo参数确定是否删除到回收站*/
+	if (bAllowUndo) {
+
+		FileOp.fFlags |= FOF_ALLOWUNDO; /*删除到回收站*/
+
+	} else {
+		
+		FileOp.fFlags &= ~FOF_ALLOWUNDO; /*直接删除,不放入回收站*/
+	}
+
+	/*删除目录*/
+	if (0 == SHFileOperation(&FileOp)) {
+		return TRUE;
+	} else {
+		return FALSE;
+	}
+}
+
+void ClearRtpFiles::Get_Channels(const char* backup_folder, const char* src_folder)
+{
+	Get_Channel(&vec_src_foldernames, src_folder);
+	if (vec_src_foldernames.empty()) {
+		BLOG_ERROR(fmt::format("[F] *** failed to load src_folder file vec_src_foldernames {}***", src_folder));
+		return;
+	}
+	Get_Channel(&vec_back_foldernames, backup_folder);
+	if (vec_back_foldernames.empty()) {
+		BLOG_ERROR(fmt::format("[F] *** failed to load src_folder file vec_back_foldernames {}***", backup_folder));
+		return;
+	}
+	for (auto back : vec_back_foldernames) {
+		std::string bak = std::string(back);
+		std::string back_channel = get_Item(bak);
+		for (auto src : vec_src_foldernames) {
+			std::string src_ = std::string(src);
+			std::string src_channel = get_Item(src_);
+			if (back_channel == src_channel) {
+				Get_List_File(bak.c_str(), src_.c_str());
+				Identical_file_check();
+				break;
+			}
+		}
+	}
+
+	//删除备份的空目录
+	{
+		std::vector<char*>::iterator iter;
+		for (auto back : vec_back_foldernames) {
+			Get_DateFiles(&vec_back_date_folder, back);
+				for (auto d : vec_back_date_folder) {
+					std::string file = std::string(d);
+					std::wstring stemp = s2ws(file);
+					LPCWSTR result = stemp.c_str();
+					BOOL ret = PathIsDirectoryEmpty(result);
+					if (ret)
+						SHDeleteFolder(file, false);
+				}
+				for (iter = vec_back_date_folder.begin(); iter != vec_back_date_folder.end();) {
+					delete (*iter);
+					*iter = NULL;
+					iter = vec_back_date_folder.erase(iter);
+				}
+				vec_back_date_folder.clear();
+			}
+	}
+
+	//剩余空间小于要求值,删除主存储
+	std::string serial = std::string(vec_src_foldernames.front());
+	serial = serial.substr(0, serial.find("\\"));
+	int gb_data = Get_Disk_Free(serial);
+	int index = 0;
+	int i = 0;
+	if (remaining_memory >= gb_data) {
+		for (auto s : vec_src_foldernames) {
+			Get_DateFiles(&vec_src_date_folder, s);
+			if (vec_src_date_folder.size() >= retension_day) {
+				index = vec_src_date_folder.size() - retension_day;
+				for (auto d : vec_src_date_folder) {
+					if (i >= index)
+						break;
+					SHDeleteFolder(d,false);
+					i++;
+				}
+			}
+			std::vector<char*>::iterator iter;
+			for (iter = vec_src_date_folder.begin(); iter != vec_src_date_folder.end();) {
+				delete (*iter);
+				*iter = NULL;
+				iter = vec_src_date_folder.erase(iter);
+			}
+			vec_src_date_folder.clear();
+			i = 0;
+		}
+	}
+
+	std::vector<char*>::iterator iter;
+	for (iter = vec_src_foldernames.begin(); iter != vec_src_foldernames.end();) {
+		delete (*iter);
+		*iter = NULL;
+		iter = vec_src_foldernames.erase(iter);
+	}
+	vec_src_foldernames.clear();
+	for (iter = vec_back_foldernames.begin(); iter != vec_back_foldernames.end();) {
+		delete (*iter);
+		*iter = NULL;
+		iter = vec_back_foldernames.erase(iter);
+	}
+	vec_back_foldernames.clear();
+}
+
+int ClearRtpFiles::Get_List_File(const char* backup_folder, const char* src_folder)
+{
+	// # read in file list and divide then into trunk ...
+	rtp_listfile(&list_src_rtpfiles, src_folder);
+	if (list_src_rtpfiles.empty()) {
+		BLOG_WARN(fmt::format("[F] *** src_folder file[{}] is empty***", src_folder));
+		return -1;
+	}
+	rtp_listfile(&list_backup_rtpfiles, backup_folder);
+	if (list_backup_rtpfiles.empty()) {
+		BLOG_WARN(fmt::format("[F] *** backup_folder file[{}] is empty ***", backup_folder));
+		return -1;
+	}
+
+	return 1;
+}
+
+int ClearRtpFiles::Get_Disk_Free(std::string serial)
+{
+	int pSize = MultiByteToWideChar(CP_OEMCP, 0, serial.c_str(), serial.size() + 1, NULL, 0);
+
+	TCHAR* buf = new wchar_t[pSize];
+	MultiByteToWideChar(CP_OEMCP, 0, serial.c_str(), serial.size() + 1, buf, pSize);
+
+	ULARGE_INTEGER available, total, free; //ULARGE_INTEGER  一个64位的无符号整型值
+	/*if (GetDiskFreeSpaceEx(TEXT("D:"), (ULARGE_INTEGER*)&available, (ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free)) {*/
+	if (GetDiskFreeSpaceEx(buf, (ULARGE_INTEGER*)&available, (ULARGE_INTEGER*)&total, (ULARGE_INTEGER*)&free)) {
+		//printf(" | 总容量 = %.2f GB,可用空间 = %.2f GB,空闲空间 = %.2f GB\n",GB(total), GB(available), GB(free));
+	}
+	else {
+		BLOG_ERROR(fmt::format("[F] *** failed to Get_Disk_Free ***"));
+		//puts("获取容量信息失败");
+	}
+	int available_ = GB(available);
+	return available_;
+}
+
+void ClearRtpFiles::init()
+{
+	life_worker = new CAppLifeThread();
+	life_worker->Start();
+	Start();
+}
+
+void ClearRtpFiles::Action()
+{
+	while (!IsAborted()) {
+		Get_Channels(backup_path.c_str(), src_path.c_str());
+		/*Get_List_File(backup_path.c_str(), src_path.c_str());*/
+		/*Identical_file_check();*/
+		std::this_thread::sleep_for(std::chrono::minutes(checktime));
+	}
+}
+
+

+ 112 - 0
RtpFilesCleaner.h

@@ -0,0 +1,112 @@
+#include <iostream>
+#include <string>
+#include <thread>
+#include <vector>
+#include <list>
+
+#include "CDiscHelper.h"
+#include "TSysThread.h"
+#include "CAppLife.h"
+#include "CTimer.h"
+
+#include "AnyCleaner.h"
+
+#define FRAME_CACHESIZE				(3840*2160*16)
+#define GB(x) ((x.HighPart << 2) + (x.LowPart >> 20) / 1024.0)   // 转换为GB单位显示
+
+
+typedef struct tagRTPFILEDESC {
+
+	char			file_name[256];
+	int				file_size;
+	std::string		name;
+	char			folder[256];
+	unsigned int	start_timesec;			// recording time_sec
+	unsigned int	start_timeusec;
+	unsigned int	end_timesec;
+	unsigned int	end_timeusec;
+	unsigned int	duration_sec;
+
+} RTPFILEDESC;
+
+
+class CAppLifeThread : public TSysThreadImpl
+{
+public:
+
+	CAppLifeThread() : m_AppLife(nullptr) {}
+	~CAppLifeThread()
+	{
+		Stop();
+
+		if (m_AppLife) {
+			delete m_AppLife;
+			m_AppLife = nullptr;
+		}
+	}
+
+	void PostQuit() { if (m_AppLife) m_AppLife->PostQuit(); }
+
+	void Action()
+	{
+		m_AppLife = new CAppLife();
+		//注意NVS_WATCHDOG_EVENT,NVS_EXIT_EVENT需要和软件狗里的cfg文件里的值相同
+#define NVS_INSTANCE_MUTEX	   "E3F9C076-84E6-4AF7-996A-1A0486BEBD79"
+#define NVS_WATCHDOG_EVENT	"E3F9C076-84E6-4AF7-996A-1A0486BEBD79-heart"
+#define NVS_EXIT_EVENT		"E3F9C076-84E6-4AF7-996A-1A0486BEBD79-quit"
+
+		//"385222EF-7909-4D58-83B0-2FB8E5EA0960"
+		if (m_AppLife->Begin((char*)NVS_INSTANCE_MUTEX, (char*)NVS_WATCHDOG_EVENT, (char*)NVS_EXIT_EVENT)) {
+
+			//LOG4CXX_ERROR(app_logger, "failed to initialize life events.");
+
+			return;
+		}
+
+		m_AppLife->WaitForQuit();
+		OutputDebugStringA("Close m_AppLife");
+	}
+private:
+	CAppLife* m_AppLife;
+};
+
+
+
+class ClearRtpFiles : public TSysThreadImpl 
+{
+public:
+
+	ClearRtpFiles();
+	~ClearRtpFiles();
+
+	void Action();
+	CAppLifeThread* life_worker;
+	int retension_day;
+	int checktime;//最小单位min
+	int remaining_memory;//最小单位GB字节
+	std::string src_path;
+	std::string backup_path;
+	std::vector<char*> vec_src_foldernames;
+	std::vector<char*> vec_back_foldernames;
+	std::vector<char*> vec_src_date_folder;
+	std::vector<char*> vec_back_date_folder;
+	std::list<RTPFILEDESC*> list_src_rtpfiles;
+	std::list<RTPFILEDESC*> list_backup_rtpfiles;
+	void Delete_file(std::string filename);
+	BOOL SHDeleteFolder(std::string pstrFolder, BOOL bAllowUndo);
+	int Get_Date_List(std::vector<char*>* pVecFolderName, char* folder_name);
+	void Get_DateFiles(std::vector<char*>* vec_foldernames, const char* src_folder);
+	int Identical_file_check();
+	bool LoadDeviceInfo();
+	void Get_Channels(const char* backup_folder, const char* src_folder);
+	void Get_Channel(std::vector<char*>* vec_foldernames, const char* src_folder);
+	int Get_Channel_List(std::vector<char*>* pVecFolderName, char* folder_name);
+	void init();
+	// find src_folder all *.rtp within [start_time, end_time] to dst_folder with the same file structure
+	int Get_List_File(const char* backup_folder, const char* src_folder);
+	//	int rtp_proc(RTPFILEDESC* rtp_filedesc, Buffer_t* mem_buffer, CRtpFrame* rtp_frame, FRAMEDATACALLBACK framedata_cb, void* user_data);
+	int rtp_listfile(std::list<RTPFILEDESC*>* list_rtpfiles, const char* src_folder);
+
+	int Get_Disk_Free(std::string serial);
+};
+

+ 7 - 0
anycleaner.cfg

@@ -0,0 +1,7 @@
+{
+  "duty_spool":"C:\\src_path\\spool",
+  "standby_spool":"C:\\back_path\\spool",
+  "check_interval":1,
+  "retension_day":7,
+  "storage_freespace":80
+}