FileInfo.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  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. class CSimpleFileComponent
  67. {
  68. public:
  69. CSimpleFileComponent()
  70. :mftCreate(0)
  71. , mftModified(0)
  72. , mftAccess(0)
  73. , mAttributes(0)
  74. , mFileSize(0)
  75. , mLevel(-1)
  76. , mNameOffset(0)
  77. , mNameLength(0)
  78. {
  79. }
  80. //For CFileShell, the inherent class must re-implement the function.
  81. //as is: return new CInherentClass(*this);
  82. virtual CSimpleFileComponent* Clone() const
  83. {
  84. return new CSimpleFileComponent(*this);
  85. }
  86. virtual void Clear()
  87. {
  88. mftCreate = mftAccess = mftModified = 0;
  89. mAttributes = 0;
  90. mLevel = -1;
  91. mNameLength = 0;
  92. mNameOffset = 0;
  93. }
  94. public:
  95. ULONGLONG mftCreate;
  96. ULONGLONG mftModified;
  97. ULONGLONG mftAccess;
  98. ULONGLONG mFileSize;
  99. DWORD mAttributes;
  100. int mLevel; //file's hierarchy display in volume.
  101. DWORD mNameOffset;
  102. DWORD mNameLength;
  103. };
  104. #if defined(_MSC_VER)
  105. static void GetTimeFormatStr(LPTSTR lpszString, DWORD dwSize, FILETIME* ftWrite)
  106. {
  107. SYSTEMTIME stUTC, stLocal;
  108. // Convert the last-write time to local time.
  109. FileTimeToSystemTime(ftWrite, &stUTC);
  110. SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
  111. // Build a string showing the date and time.
  112. sprintf_s(lpszString, dwSize, "%02d/%02d/%d %02d:%02d:%02d",
  113. stLocal.wMonth, stLocal.wDay, stLocal.wYear,
  114. stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
  115. return;
  116. }
  117. #else
  118. static void GetTimeFormatStr(LPTSTR lpszString, DWORD dwSize, const time_t* ftWrite)
  119. {
  120. tm* curTime = localtime(ftWrite);
  121. sprintf(lpszString, "%02d/%02d/%d %02d:%02d:%02d", (1 + curTime->tm_mon),
  122. curTime->tm_mday, (1900 + curTime->tm_year), curTime->tm_hour, curTime->tm_min, curTime->tm_sec);
  123. return;
  124. }
  125. #endif //_MSC_VER
  126. //OutString must be [DEFAULT_OUTPUT_FORMAT_SIZE] size.
  127. static void ByteSprintf(char * outString, double inNum, char inFormat = 'A')
  128. {
  129. memset(outString, 0, sizeof(char)*DEFAULT_OUTPUT_FORMAT_SIZE);
  130. int conv;
  131. const char* suffix;
  132. const char* format;
  133. switch(toupper(inFormat))
  134. {
  135. case 'B': conv = kConv_Unit; break;
  136. case 'K': conv = kConv_Kilo; break;
  137. case 'M': conv = kConv_Mega; break;
  138. case 'G': conv = kConv_Giga; break;
  139. default:
  140. case 'A':
  141. {
  142. double tmpNum = inNum;
  143. conv = kConv_Unit;
  144. while(tmpNum >= 1024.0 && conv <= kConv_Tera){
  145. tmpNum /= 1024.0;
  146. if(conv == kConv_Giga)
  147. break;
  148. conv++;
  149. }
  150. break;
  151. }
  152. }
  153. inNum *= kConversion[conv];
  154. suffix = kLabel_Byte[conv];
  155. if(inNum < 9.995) {
  156. format = "%4.2f %s";
  157. }
  158. else if (inNum < 99.95) {
  159. format = "%4.1f %s";
  160. }
  161. else if(inNum < 999.5) {
  162. format = "%4.0f %s";
  163. }
  164. else {
  165. format = "%4.0f %s";
  166. }
  167. #if defined(_MSC_VER)
  168. _snprintf_s(outString, DEFAULT_OUTPUT_FORMAT_SIZE, DEFAULT_OUTPUT_FORMAT_SIZE, format, inNum, suffix);
  169. #else
  170. snprintf(outString, DEFAULT_OUTPUT_FORMAT_SIZE, format, inNum, suffix);
  171. #endif //_MSC_VER
  172. }
  173. static void PrintDiskStatus(LPCTSTR dir, const unsigned long long& uiDiskFreeSize, const unsigned long long& uiDiskOverallSize)
  174. {
  175. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  176. char szResult2[DEFAULT_OUTPUT_FORMAT_SIZE];
  177. ByteSprintf(szResult, (double)uiDiskFreeSize);
  178. ByteSprintf(szResult2, (double)uiDiskOverallSize);
  179. double dFreeRate = (uiDiskFreeSize * kConversion[3]) / (uiDiskOverallSize * kConversion[3]);
  180. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("[Disk(%s)] total: %s, free: %s, rate: %.1lf%%.", dir, szResult2, szResult, dFreeRate * 100);
  181. }
  182. struct DiskInfo
  183. {
  184. #if defined(_MSC_VER)
  185. //录像文件所在磁盘的空间大小(Bytes)
  186. ULARGE_INTEGER mUliDiskOverallSize;
  187. //录像文件夹所在磁盘的剩余空间大小(Bytes)
  188. ULARGE_INTEGER mUliDiskFreeSize;
  189. //录像文件夹的大小(Bytes)
  190. ULARGE_INTEGER mUiAllVideoFilesBytes;
  191. //录像文件数量
  192. UINT mUVideoFileCount;
  193. //未上传录像文件夹的大小(Bytes)
  194. ULARGE_INTEGER mUiUploadVideoFileBytes;
  195. //录像文件生成的有效天数
  196. UINT mUVideoCreateDayCount;
  197. BOOL mBAverageAvailable;
  198. //平均录像文件的大小(Bytes)
  199. ULARGE_INTEGER mUliAverageFileSize;
  200. //平均每天录像的数目(当天无录像的不考虑)
  201. UINT mUAverageFileCreated;
  202. //需预留的磁盘空间大小(Bytes)
  203. ULARGE_INTEGER mUiFreeBytesRequired;
  204. //当前最大的录像文件
  205. ULARGE_INTEGER mUiMaxFileSize;
  206. #else
  207. unsigned long long mUliDiskOverallSize;
  208. unsigned long long mUliDiskFreeSize;
  209. unsigned long long mUiAllVideoFilesBytes;
  210. unsigned int mUVideoFileCount;
  211. unsigned long long mUiUploadVideoFileBytes;
  212. unsigned int mUVideoCreateDayCount;
  213. int mBAverageAvailable;
  214. unsigned long long mUliAverageFileSize;
  215. unsigned int mUAverageFileCreated;
  216. unsigned long long mUiFreeBytesRequired;
  217. unsigned long long mUiMaxFileSize;
  218. #endif //_MSC_VER
  219. DiskInfo()
  220. : mUVideoFileCount(0)
  221. , mUVideoCreateDayCount(0)
  222. , mBAverageAvailable(FALSE)
  223. , mUAverageFileCreated(0)
  224. {
  225. #if defined(_MSC_VER)
  226. mUliDiskOverallSize.QuadPart = 0;
  227. mUliDiskFreeSize.QuadPart = 0;
  228. mUiAllVideoFilesBytes.QuadPart = 0;
  229. mUliAverageFileSize.QuadPart = 0;
  230. mUiUploadVideoFileBytes.QuadPart = ULONGLONG_ERROR;
  231. mUiFreeBytesRequired.QuadPart = 0;
  232. mUiMaxFileSize.QuadPart = 0;
  233. #else
  234. mUliDiskOverallSize = 0;
  235. mUliDiskFreeSize = 0;
  236. mUiAllVideoFilesBytes = 0;
  237. mUliAverageFileSize = 0;
  238. mUiUploadVideoFileBytes = 0;
  239. mUiFreeBytesRequired = 0;
  240. mUiMaxFileSize = 0;
  241. #endif //_MSC_VER
  242. }
  243. BOOL Initial(LPCTSTR lpszVideoPath)
  244. {
  245. if(lpszVideoPath == NULL || strlen(lpszVideoPath) == 0)
  246. return FALSE;
  247. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("当前录像文件夹所在的磁盘: %c", lpszVideoPath[0]);
  248. #if defined(_MSC_VER)
  249. BOOL bRet = GetDiskSpace(lpszVideoPath, mUliDiskOverallSize, mUliDiskFreeSize);
  250. if (bRet) {
  251. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  252. ByteSprintf(szResult, (double)mUliDiskOverallSize.QuadPart);
  253. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件所在磁盘的空间大小 : %s", szResult);
  254. ByteSprintf(szResult, (double)mUliDiskFreeSize.QuadPart);
  255. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件夹所在磁盘的剩余空间大小 : %s", szResult);
  256. }
  257. return bRet;
  258. #else
  259. BOOL bRet = GetDiskSpace(lpszVideoPath, mUliDiskOverallSize, mUliDiskFreeSize);
  260. if (bRet) {
  261. char szResult[DEFAULT_OUTPUT_FORMAT_SIZE];
  262. ByteSprintf(szResult, (double)mUliDiskOverallSize);
  263. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件所在磁盘的空间大小 : %s", szResult);
  264. ByteSprintf(szResult, (double)mUliDiskFreeSize);
  265. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("录像文件夹所在磁盘的剩余空间大小 : %s", szResult);
  266. }
  267. return bRet;
  268. #endif //_MSC_VER
  269. }
  270. #if defined(_MSC_VER)
  271. void SetUploadVideoDirSize(ULARGE_INTEGER uiRhs)
  272. {
  273. mUiUploadVideoFileBytes = uiRhs;
  274. }
  275. void SetMaxVideoFileSize(ULARGE_INTEGER uiRhs)
  276. {
  277. mUiMaxFileSize = uiRhs;
  278. }
  279. static BOOL GetDiskSpace(
  280. LPCTSTR lpszVideoPath,
  281. ULARGE_INTEGER& uiTotalByteNumber,
  282. ULARGE_INTEGER& uiTotalFreeByteNumber)
  283. {
  284. if (lpszVideoPath == NULL || strlen(lpszVideoPath) == 0)
  285. return FALSE;
  286. ULARGE_INTEGER uiFreeBytesAvailable;
  287. ULARGE_INTEGER uiTotalNumberOfBytes;
  288. ULARGE_INTEGER uiTotalNumberOfFreeBytes;
  289. char szDisk[MAX_PATH] = { 0 };
  290. sprintf_s(szDisk, "%c:", lpszVideoPath[0]);
  291. BOOL bRet = GetDiskFreeSpaceExA(szDisk,
  292. &uiFreeBytesAvailable,
  293. &uiTotalNumberOfBytes,
  294. &uiTotalNumberOfFreeBytes);
  295. if (!bRet) {
  296. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetDiskFreeSpaceEx(%s) failed, GLE=%u", szDisk, GetLastError());
  297. return FALSE;
  298. }
  299. uiTotalByteNumber = uiTotalNumberOfBytes;
  300. uiTotalFreeByteNumber = uiTotalNumberOfFreeBytes;
  301. return bRet;
  302. }
  303. #else
  304. void SetUploadVideoDirSize(unsigned long long uiRhs)
  305. {
  306. mUiUploadVideoFileBytes = uiRhs;
  307. }
  308. void SetMaxVideoFileSize(unsigned long long uiRhs)
  309. {
  310. mUiMaxFileSize = uiRhs;
  311. }
  312. static BOOL GetDiskSpace(LPCTSTR lpszVideoPath,unsigned long long& uiTotalByteNumber, unsigned long long& uiTotalFreeByteNumber)
  313. {
  314. struct statfs buf;
  315. int result = statfs(lpszVideoPath, &buf);
  316. if (result < 0) {
  317. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("statfs failed: %d", errno);
  318. return FALSE;
  319. }
  320. /**
  321. statfs结构中可用空间块数有两种f_bfree和 f_bavail,前者是硬盘所有剩余空间,后者为非root用户剩余空间,
  322. ext3文件系统给root用户分有5%的独享空间,所以这里是不同的地方
  323. */
  324. //uiTotalByteNumber = (((long long)buf.f_bsize * (long long)buf.f_blocks));
  325. //uiTotalFreeByteNumber = (((long long)buf.f_bsize * (long long)buf.f_bfree));
  326. const int percent = (buf.f_blocks - buf.f_bfree) * 100 / (buf.f_blocks - buf.f_bfree + buf.f_bavail);
  327. uiTotalByteNumber = (((long long)buf.f_bsize * (long long)(buf.f_blocks - buf.f_bfree + buf.f_bavail)));
  328. uiTotalFreeByteNumber = (((long long)buf.f_bsize * (long long)buf.f_bavail));
  329. return TRUE;
  330. }
  331. #endif //_MSC_VER
  332. };
  333. #endif //_RESOURCE_FILEINFO_H__