FileInfo.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611
  1. #ifndef _RESOURCE_FILEINFO_H__
  2. #define _RESOURCE_FILEINFO_H__
  3. #pragma once
  4. #include "stdafx.h"
  5. #include "SpFSM.h"
  6. #ifndef _WIN32
  7. #include <time.h>
  8. #include <sys/vfs.h>
  9. #endif //NOT _WIN32
  10. #ifndef MAX_PATH
  11. #define MAX_PATH 1024
  12. #endif
  13. #ifndef ULONGLONG_ERROR
  14. #if defined(_MSC_VER)
  15. #define ULONGLONG_ERROR (0xffffffffffffffffui64)
  16. #else
  17. #define ULONGLONG_ERROR ((unsigned long long)(-1))
  18. #endif //_MSC_VER
  19. #endif
  20. #ifndef ULONGLONG_MAX
  21. #if defined(_MSC_VER)
  22. #define ULONGLONG_MAX (0xffffffffffffffffui64)
  23. #else
  24. #define ULONGLONG_MAX ((unsigned long long)(-1))
  25. #endif //_MSC_VER
  26. #endif
  27. #define DEFAULT_VIDEOFILE_CREATE_COUNT 1
  28. #define DEFAULT_AVAILALBE_DATE_COUNT 7
  29. #define LESS_AVAILALBE_DATE_COUNT 3
  30. #define LEAST_AVAILALBE_DATE_COUNT 1
  31. #define BASE_AVAILALBE_DATE_COUNT 1
  32. #define DEFAULT_SAVE_DATE_COUNT 14
  33. #define DEFAULT_OUTPUT_FORMAT_SIZE 128
  34. /* labels for Byte formats [KMG] */
  35. static const char* kLabel_Byte[] =
  36. {
  37. "Byte",
  38. "KByte",
  39. "MByte",
  40. "GByte",
  41. "TByte"
  42. };
  43. const double kConversion[] =
  44. {
  45. 1.0, /* unit */
  46. 1.0 / 1024, /* Kilo */
  47. 1.0 / 1024 / 1024, /* Mega */
  48. 1.0 / 1024 / 1024 / 1024, /* Giga */
  49. 1.0 / 1024 / 1024 / 1024 / 1024 /* Tera */
  50. };
  51. enum {
  52. kConv_Unit,
  53. kConv_Kilo,
  54. kConv_Mega,
  55. kConv_Giga,
  56. kConv_Tera
  57. };
  58. const long kKilo_to_Unit = 1024;
  59. const long kMega_to_Unit = 1024 * 1024;
  60. const long kGiga_to_Unit = 1024 * 1024 * 1024;
  61. //const long kTera_to_Unit = 1024 * 1024 * 1024 * 1024;
  62. #include <queue>
  63. #include <vector>
  64. #include <string>
  65. using namespace std;
  66. //OutString must be [DEFAULT_OUTPUT_FORMAT_SIZE] size.
  67. static void ByteSprintf(char * outString, double inNum, char inFormat = 'A')
  68. {
  69. memset(outString, 0, sizeof(char)*DEFAULT_OUTPUT_FORMAT_SIZE);
  70. int conv;
  71. const char* suffix;
  72. const char* format;
  73. switch(toupper(inFormat))
  74. {
  75. case 'B': conv = kConv_Unit; break;
  76. case 'K': conv = kConv_Kilo; break;
  77. case 'M': conv = kConv_Mega; break;
  78. case 'G': conv = kConv_Giga; break;
  79. default:
  80. case 'A':
  81. {
  82. double tmpNum = inNum;
  83. conv = kConv_Unit;
  84. while(tmpNum >= 1024.0 && conv <= kConv_Tera){
  85. tmpNum /= 1024.0;
  86. if(conv == kConv_Giga)
  87. break;
  88. conv++;
  89. }
  90. break;
  91. }
  92. }
  93. inNum *= kConversion[conv];
  94. suffix = kLabel_Byte[conv];
  95. if(inNum < 9.995) {
  96. format = "%4.2f %s";
  97. }
  98. else if (inNum < 99.95) {
  99. format = "%4.1f %s";
  100. }
  101. else if(inNum < 999.5) {
  102. format = "%4.0f %s";
  103. }
  104. else {
  105. format = "%4.0f %s";
  106. }
  107. #if defined(_MSC_VER)
  108. _snprintf_s(outString, DEFAULT_OUTPUT_FORMAT_SIZE, DEFAULT_OUTPUT_FORMAT_SIZE, format, inNum, suffix);
  109. #else
  110. snprintf(outString, DEFAULT_OUTPUT_FORMAT_SIZE, format, inNum, suffix);
  111. #endif //_MSC_VER
  112. }
  113. static void PrintDiskStatus(LPCTSTR dir, const unsigned long long& uiDiskFreeSize, const unsigned long long& uiDiskOverallSize)
  114. {
  115. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  116. char szResult2[DEFAULT_OUTPUT_FORMAT_SIZE];
  117. ByteSprintf(szResult, (double)uiDiskFreeSize);
  118. ByteSprintf(szResult2, (double)uiDiskOverallSize);
  119. double dFreeRate = (uiDiskFreeSize * kConversion[3]) / (uiDiskOverallSize * kConversion[3]);
  120. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[Disk(%s)] total: %s, free: %s, rate: %.1lf%%.", dir, szResult2, szResult, dFreeRate * 100);
  121. }
  122. struct TmpFileInfo
  123. {
  124. #if defined(_MSC_VER)
  125. string msFileName;
  126. FILETIME mftEditTime;
  127. DWORD mDwFileSizeHeight;
  128. DWORD mDwFileSizeLow;
  129. TmpFileInfo(LPCTSTR lpszFileName, const PFILETIME ftEditTime, DWORD dwFileSizeHeight, DWORD dwFileSizeLow)
  130. : msFileName(lpszFileName)
  131. , mftEditTime(*ftEditTime)
  132. , mDwFileSizeHeight(dwFileSizeHeight)
  133. , mDwFileSizeLow(dwFileSizeLow)
  134. {
  135. }
  136. #else
  137. string msFileName;
  138. time_t mftEditTime;
  139. off_t ftSize;
  140. TmpFileInfo() :msFileName(""), mftEditTime(0), ftSize(0){}
  141. TmpFileInfo(LPCTSTR lpszFileName, const time_t ftEditTime, off_t fileSize)
  142. : msFileName(lpszFileName)
  143. , mftEditTime(ftEditTime)
  144. , ftSize(fileSize)
  145. {
  146. }
  147. ~TmpFileInfo() {}
  148. #endif //_MSC_VER
  149. };
  150. struct Comparetor
  151. {
  152. bool operator () (const TmpFileInfo* lhs, const TmpFileInfo* rhs) const
  153. {
  154. #if defined(_MSC_VER)
  155. if (CompareFileTime(&(lhs->mftEditTime), &(rhs->mftEditTime)) > 0)
  156. return true;
  157. return false;
  158. #else
  159. return (lhs->mftEditTime > rhs->mftEditTime);
  160. #endif //_MSC_VER
  161. }
  162. };
  163. struct DiskInfo
  164. {
  165. #if defined(_MSC_VER)
  166. //录像文件所在磁盘的空间大小(Bytes)
  167. ULARGE_INTEGER mUliDiskOverallSize;
  168. //录像文件夹所在磁盘的剩余空间大小(Bytes)
  169. ULARGE_INTEGER mUliDiskFreeSize;
  170. //录像文件夹的大小(Bytes)
  171. ULARGE_INTEGER mUiAllVideoFilesBytes;
  172. //录像文件数量
  173. UINT mUVideoFileCount;
  174. //未上传录像文件夹的大小(Bytes)
  175. ULARGE_INTEGER mUiUploadVideoFileBytes;
  176. //录像文件生成的有效天数
  177. UINT mUVideoCreateDayCount;
  178. BOOL mBAverageAvailable;
  179. //平均录像文件的大小(Bytes)
  180. ULARGE_INTEGER mUliAverageFileSize;
  181. //平均每天录像的数目(当天无录像的不考虑)
  182. UINT mUAverageFileCreated;
  183. //需预留的磁盘空间大小(Bytes)
  184. ULARGE_INTEGER mUiFreeBytesRequired;
  185. //当前最大的录像文件
  186. ULARGE_INTEGER mUiMaxFileSize;
  187. #else
  188. unsigned long long mUliDiskOverallSize;
  189. unsigned long long mUliDiskFreeSize;
  190. unsigned long long mUiAllVideoFilesBytes;
  191. unsigned int mUVideoFileCount;
  192. unsigned long long mUiUploadVideoFileBytes;
  193. unsigned int mUVideoCreateDayCount;
  194. int mBAverageAvailable;
  195. unsigned long long mUliAverageFileSize;
  196. unsigned int mUAverageFileCreated;
  197. unsigned long long mUiFreeBytesRequired;
  198. unsigned long long mUiMaxFileSize;
  199. #endif //_MSC_VER
  200. DiskInfo()
  201. : mUVideoFileCount(0)
  202. , mUVideoCreateDayCount(0)
  203. , mBAverageAvailable(FALSE)
  204. , mUAverageFileCreated(0)
  205. {
  206. #if defined(_MSC_VER)
  207. mUliDiskOverallSize.QuadPart = 0;
  208. mUliDiskFreeSize.QuadPart = 0;
  209. mUiAllVideoFilesBytes.QuadPart = 0;
  210. mUliAverageFileSize.QuadPart = 0;
  211. mUiUploadVideoFileBytes.QuadPart = ULONGLONG_ERROR;
  212. mUiFreeBytesRequired.QuadPart = 0;
  213. mUiMaxFileSize.QuadPart = 0;
  214. #else
  215. mUliDiskOverallSize = 0;
  216. mUliDiskFreeSize = 0;
  217. mUiAllVideoFilesBytes = 0;
  218. mUliAverageFileSize = 0;
  219. mUiUploadVideoFileBytes = 0;
  220. mUiFreeBytesRequired = 0;
  221. mUiMaxFileSize = 0;
  222. #endif //_MSC_VER
  223. }
  224. BOOL Initial(LPCTSTR lpszVideoPath)
  225. {
  226. if(lpszVideoPath == NULL || strlen(lpszVideoPath) == 0)
  227. return FALSE;
  228. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("当前录像文件夹所在的磁盘: %c", lpszVideoPath[0]);
  229. #if defined(_MSC_VER)
  230. BOOL bRet = GetDiskSpace(lpszVideoPath, mUliDiskOverallSize, mUliDiskFreeSize);
  231. if (bRet) {
  232. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  233. ByteSprintf(szResult, (double)mUliDiskOverallSize.QuadPart);
  234. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件所在磁盘的空间大小 : %s", szResult);
  235. ByteSprintf(szResult, (double)mUliDiskFreeSize.QuadPart);
  236. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件夹所在磁盘的剩余空间大小 : %s", szResult);
  237. }
  238. return bRet;
  239. #else
  240. BOOL bRet = GetDiskSpace(lpszVideoPath, mUliDiskOverallSize, mUliDiskFreeSize);
  241. if (bRet) {
  242. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  243. ByteSprintf(szResult, (double)mUliDiskOverallSize);
  244. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件所在磁盘的空间大小 : %s", szResult);
  245. ByteSprintf(szResult, (double)mUliDiskFreeSize);
  246. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件夹所在磁盘的剩余空间大小 : %s", szResult);
  247. }
  248. return bRet;
  249. #endif //_MSC_VER
  250. }
  251. #if defined(_MSC_VER)
  252. void SetUploadVideoDirSize(ULARGE_INTEGER uiRhs)
  253. {
  254. mUiUploadVideoFileBytes = uiRhs;
  255. }
  256. void SetMaxVideoFileSize(ULARGE_INTEGER uiRhs)
  257. {
  258. mUiMaxFileSize = uiRhs;
  259. }
  260. BOOL CalAverRequreSpaceEachDay(
  261. const ULARGE_INTEGER& uiAllVideoFileBytes,
  262. const UINT uVideoFileCount,
  263. const UINT uAvailDayCount,
  264. const UINT uRequredDays,
  265. ULARGE_INTEGER& uiRequireBytes)
  266. {
  267. mUiAllVideoFilesBytes = uiAllVideoFileBytes;
  268. mUVideoFileCount = uVideoFileCount;
  269. mUVideoCreateDayCount = uAvailDayCount;
  270. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  271. ByteSprintf(szResult, (double)mUiAllVideoFilesBytes.QuadPart);
  272. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件夹的大小 : %s", szResult);
  273. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("已上传录像文件数量 : %u", mUVideoFileCount);
  274. //平均每天的录像数目
  275. mUAverageFileCreated = DEFAULT_VIDEOFILE_CREATE_COUNT;
  276. if (mUVideoCreateDayCount != 0) {
  277. mUAverageFileCreated = mUVideoFileCount / mUVideoCreateDayCount;
  278. }
  279. //平均录像文件的大小 TODO:
  280. mUliAverageFileSize = mUiAllVideoFilesBytes;
  281. if (mUVideoFileCount != 0) {
  282. mUliAverageFileSize.QuadPart = mUiAllVideoFilesBytes.QuadPart / mUVideoFileCount;
  283. }
  284. ByteSprintf(szResult, (double)mUliAverageFileSize.QuadPart);
  285. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("平均录像文件的大小 : %s", szResult);
  286. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("平均每天录像的数目 : %u", mUAverageFileCreated);
  287. //预估每天需要提供的空间大小
  288. ULARGE_INTEGER uiForecastDailySpace;
  289. uiForecastDailySpace.QuadPart = mUliAverageFileSize.QuadPart * mUAverageFileCreated;
  290. //至少需预留的磁盘空间大小
  291. ULARGE_INTEGER uiForecastSpaceAvail;
  292. uiForecastSpaceAvail.QuadPart = uiForecastDailySpace.QuadPart * uRequredDays;
  293. ByteSprintf(szResult, (double)uiForecastSpaceAvail.QuadPart);
  294. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("需预留的磁盘空间大小 : %s", szResult);
  295. mUiFreeBytesRequired = uiForecastSpaceAvail;
  296. uiRequireBytes = uiForecastSpaceAvail;
  297. return (mBAverageAvailable = TRUE);
  298. }
  299. BOOL IsNeedToDoClearJobEx(LPCTSTR lpszDiskPath,
  300. const ULARGE_INTEGER& uiRequiredByts,
  301. const ULARGE_INTEGER& uiAdjustmentFactor, PULARGE_INTEGER pUiRealRequiredByts)
  302. {
  303. BOOL bRet = FALSE;
  304. if (lpszDiskPath == NULL || strlen(lpszDiskPath) == 0)
  305. return FALSE;
  306. if (pUiRealRequiredByts != NULL) {
  307. pUiRealRequiredByts->QuadPart = 0;
  308. }
  309. ULARGE_INTEGER uiDiskOverallSize;
  310. ULARGE_INTEGER uiDiskFreeSize;
  311. bRet = GetDiskSpace(lpszDiskPath, uiDiskOverallSize, uiDiskFreeSize);
  312. if (bRet) {
  313. assert(uiDiskOverallSize.QuadPart != 0);
  314. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  315. char szResult2[DEFAULT_OUTPUT_FORMAT_SIZE];
  316. ByteSprintf(szResult, (double)uiDiskFreeSize.QuadPart);
  317. ByteSprintf(szResult2, (double)uiDiskOverallSize.QuadPart);
  318. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Current operated disk(%s) : %s / %s", lpszDiskPath, szResult, szResult2);
  319. ULARGE_INTEGER uiForecastSpaceAvail;
  320. uiForecastSpaceAvail.QuadPart = uiRequiredByts.QuadPart + uiAdjustmentFactor.QuadPart;
  321. if (uiForecastSpaceAvail.QuadPart > uiDiskFreeSize.QuadPart) {
  322. ULARGE_INTEGER uiTemp;
  323. uiTemp.QuadPart = uiForecastSpaceAvail.QuadPart - uiDiskFreeSize.QuadPart;
  324. ByteSprintf(szResult, (double)uiTemp.QuadPart);
  325. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("More space required : %s", szResult);
  326. if (pUiRealRequiredByts != NULL) {
  327. pUiRealRequiredByts->QuadPart = uiTemp.QuadPart;
  328. }
  329. }
  330. }
  331. return bRet;
  332. }
  333. BOOL IsNeedToDoClearJob(const ULARGE_INTEGER& uiAdjustmentFactor, PULARGE_INTEGER pUiRealRequiredByts)
  334. {
  335. BOOL bResult = FALSE;
  336. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  337. //ByteSprintf(szResult, ULONGLONG_ERROR);
  338. if (mUiUploadVideoFileBytes.QuadPart != ULONGLONG_ERROR) {
  339. ByteSprintf(szResult, (double)mUiUploadVideoFileBytes.QuadPart);
  340. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("未上传录像文件夹的大小 : %s", szResult);
  341. }
  342. #if JUS_A_TEST
  343. //uiAdjustmentFactor.QuadPart = 1024ui64 * 1024 * 1024 * 100 * 4;
  344. #endif
  345. if (pUiRealRequiredByts != NULL) {
  346. pUiRealRequiredByts->QuadPart = 0;
  347. }
  348. ULARGE_INTEGER uiForecastSpaceAvail;
  349. if (!mBAverageAvailable) {
  350. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("mBAverageAvailable == FALSE");
  351. return FALSE;
  352. }
  353. uiForecastSpaceAvail.QuadPart = mUiFreeBytesRequired.QuadPart + uiAdjustmentFactor.QuadPart;
  354. assert(mUliDiskOverallSize.QuadPart != 0);
  355. if (uiForecastSpaceAvail.QuadPart > mUliDiskFreeSize.QuadPart) {
  356. //TODO: Alert !!
  357. ULARGE_INTEGER uiTemp;
  358. uiTemp.QuadPart = uiForecastSpaceAvail.QuadPart - mUliDiskFreeSize.QuadPart;
  359. ByteSprintf(szResult, (double)uiTemp.QuadPart);
  360. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("需要待清理的空间大小 : %s", szResult);
  361. if (pUiRealRequiredByts != NULL) {
  362. pUiRealRequiredByts->QuadPart = uiTemp.QuadPart;
  363. }
  364. bResult = TRUE;
  365. } else {
  366. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("当前无需对磁盘空间进行清理。");
  367. }
  368. return bResult;
  369. }
  370. static BOOL GetDiskSpace(
  371. LPCTSTR lpszVideoPath,
  372. ULARGE_INTEGER& uiTotalByteNumber,
  373. ULARGE_INTEGER& uiTotalFreeByteNumber)
  374. {
  375. if (lpszVideoPath == NULL || strlen(lpszVideoPath) == 0)
  376. return FALSE;
  377. ULARGE_INTEGER uiFreeBytesAvailable;
  378. ULARGE_INTEGER uiTotalNumberOfBytes;
  379. ULARGE_INTEGER uiTotalNumberOfFreeBytes;
  380. char szDisk[MAX_PATH] = { 0 };
  381. sprintf_s(szDisk, "%c:", lpszVideoPath[0]);
  382. BOOL bRet = GetDiskFreeSpaceExA(szDisk,
  383. &uiFreeBytesAvailable,
  384. &uiTotalNumberOfBytes,
  385. &uiTotalNumberOfFreeBytes);
  386. if (!bRet) {
  387. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDiskFreeSpaceEx(%s) failed, GLE=%u", szDisk, GetLastError());
  388. return FALSE;
  389. }
  390. uiTotalByteNumber = uiTotalNumberOfBytes;
  391. uiTotalFreeByteNumber = uiTotalNumberOfFreeBytes;
  392. return bRet;
  393. }
  394. #else
  395. void SetUploadVideoDirSize(unsigned long long uiRhs)
  396. {
  397. mUiUploadVideoFileBytes = uiRhs;
  398. }
  399. void SetMaxVideoFileSize(unsigned long long uiRhs)
  400. {
  401. mUiMaxFileSize = uiRhs;
  402. }
  403. BOOL CalAverRequreSpaceEachDay(
  404. const unsigned long long& uiAllVideoFileBytes,
  405. const unsigned int uVideoFileCount,
  406. const unsigned int uAvailDayCount,
  407. const unsigned int uRequredDays,
  408. unsigned long long& uiRequireBytes)
  409. {
  410. mUiAllVideoFilesBytes = uiAllVideoFileBytes;
  411. mUVideoFileCount = uVideoFileCount;
  412. mUVideoCreateDayCount = uAvailDayCount;
  413. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  414. ByteSprintf(szResult, (double)mUiAllVideoFilesBytes);
  415. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件夹的大小 : %s", szResult);
  416. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件数量(已上传+未上传) : %u", mUVideoFileCount);
  417. //平均每天的录像数目
  418. mUAverageFileCreated = DEFAULT_VIDEOFILE_CREATE_COUNT;
  419. if (mUVideoCreateDayCount != 0) {
  420. mUAverageFileCreated = mUVideoFileCount / mUVideoCreateDayCount;
  421. }
  422. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("平均每天录像的数目 : %u", mUAverageFileCreated);
  423. //平均录像文件的大小 TODO:
  424. if (mUVideoFileCount != 0) {
  425. mUliAverageFileSize = mUiAllVideoFilesBytes / mUVideoFileCount;
  426. } else {
  427. mUliAverageFileSize = mUiAllVideoFilesBytes;
  428. }
  429. ByteSprintf(szResult, (double)mUliAverageFileSize);
  430. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("平均录像文件的大小 : %s", szResult);
  431. //预估每天需要提供的空间大小 = 平均每个文件大小 * 平均每天文件数量
  432. const unsigned long long uiForecastDailySpace = mUliAverageFileSize * mUAverageFileCreated;
  433. //至少需预留的磁盘空间大小 = 平均每天需要的大小*要求留存的天数
  434. const unsigned long long uiForecastSpaceAvail = uiForecastDailySpace * uRequredDays;
  435. ByteSprintf(szResult, (double)uiForecastSpaceAvail);
  436. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("需预留的磁盘空间大小(平均每个文件大小 * 平均每天文件数量 * 要求留存的天数#%u) : %s", uRequredDays, szResult);
  437. mUiFreeBytesRequired = uiForecastSpaceAvail;
  438. uiRequireBytes = uiForecastSpaceAvail;
  439. return (mBAverageAvailable = TRUE);
  440. }
  441. /**
  442. uiAdjustmentFactor: 增量调整因子
  443. */
  444. BOOL IsNeedToDoClearJobEx(LPCTSTR lpszDiskPath,
  445. const unsigned long long& uiRequiredByts,
  446. const unsigned long long& uiAdjustmentFactor,
  447. unsigned long long* pUiRealRequiredByts)
  448. {
  449. BOOL bRet = FALSE;
  450. if (lpszDiskPath == NULL || strlen(lpszDiskPath) == 0)
  451. return FALSE;
  452. if (pUiRealRequiredByts != NULL) {
  453. *pUiRealRequiredByts = 0;
  454. }
  455. unsigned long long uiDiskOverallSize;
  456. unsigned long long uiDiskFreeSize;
  457. bRet = GetDiskSpace(lpszDiskPath, uiDiskOverallSize, uiDiskFreeSize);
  458. if (bRet) {
  459. assert(uiDiskOverallSize != 0);
  460. PrintDiskStatus(lpszDiskPath, uiDiskFreeSize, uiDiskOverallSize);
  461. const unsigned long long uiForecastSpaceAvail = uiRequiredByts + uiAdjustmentFactor;
  462. if (uiForecastSpaceAvail > uiDiskFreeSize) {
  463. unsigned long long uiTemp;
  464. uiTemp = uiForecastSpaceAvail - uiDiskFreeSize;
  465. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  466. ByteSprintf(szResult, (double)uiTemp);
  467. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("More space required : %s", szResult);
  468. if (pUiRealRequiredByts != NULL) {
  469. *pUiRealRequiredByts = uiTemp;
  470. }
  471. return TRUE;
  472. }
  473. }
  474. return FALSE;
  475. }
  476. BOOL IsNeedToDoClearJob(const unsigned long long& uiAdjustmentFactor, unsigned long long* pUiRealRequiredByts)
  477. {
  478. BOOL bResult = FALSE;
  479. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  480. if (mUiUploadVideoFileBytes != ULONGLONG_ERROR) {
  481. ByteSprintf(szResult, (double)mUiUploadVideoFileBytes);
  482. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("未上传录像文件夹的大小 : %s", szResult);
  483. }
  484. if (pUiRealRequiredByts != NULL) {
  485. *pUiRealRequiredByts = 0;
  486. }
  487. unsigned long long uiForecastSpaceAvail;
  488. if (!mBAverageAvailable) {
  489. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("mBAverageAvailable == FALSE");
  490. return FALSE;
  491. }
  492. uiForecastSpaceAvail = mUiFreeBytesRequired + uiAdjustmentFactor;
  493. assert(mUliDiskOverallSize != 0);
  494. if (uiForecastSpaceAvail > mUliDiskFreeSize) {
  495. //TODO: Alert !!
  496. unsigned long long uiTemp;
  497. uiTemp = uiForecastSpaceAvail - mUliDiskFreeSize;
  498. ByteSprintf(szResult, (double)uiTemp);
  499. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("需要待清理的空间大小 : %s", szResult);
  500. if (pUiRealRequiredByts != NULL) {
  501. *pUiRealRequiredByts = uiTemp;
  502. }
  503. bResult = TRUE;
  504. } else {
  505. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("当前无需对磁盘空间进行清理。");
  506. }
  507. return bResult;
  508. }
  509. static BOOL GetDiskSpace(LPCTSTR lpszVideoPath,unsigned long long& uiTotalByteNumber, unsigned long long& uiTotalFreeByteNumber)
  510. {
  511. struct statfs buf;
  512. int result = statfs(lpszVideoPath, &buf);
  513. if (result < 0) {
  514. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("statfs failed: %d", errno);
  515. return FALSE;
  516. }
  517. /**
  518. statfs结构中可用空间块数有两种f_bfree和 f_bavail,前者是硬盘所有剩余空间,后者为非root用户剩余空间,
  519. ext3文件系统给root用户分有5%的独享空间,所以这里是不同的地方
  520. */
  521. //uiTotalByteNumber = (((long long)buf.f_bsize * (long long)buf.f_blocks));
  522. //uiTotalFreeByteNumber = (((long long)buf.f_bsize * (long long)buf.f_bfree));
  523. const int percent = (buf.f_blocks - buf.f_bfree) * 100 / (buf.f_blocks - buf.f_bfree + buf.f_bavail);
  524. uiTotalByteNumber = (((long long)buf.f_bsize * (long long)(buf.f_blocks - buf.f_bfree + buf.f_bavail)));
  525. uiTotalFreeByteNumber = (((long long)buf.f_bsize * (long long)buf.f_bavail));
  526. return TRUE;
  527. }
  528. #endif //_MSC_VER
  529. };
  530. #endif //_RESOURCE_FILEINFO_H__