+/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options:
+
+CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
+CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
+CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
+
+For *nix builds that support visibility attribute, you can define similar behavior by
+
+setting default visibility to hidden by adding
+-fvisibility=hidden (for gcc)
+or
+-xldscope=hidden (for sun cc)
+to CFLAGS
+
+then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
+
+*/
+
+#define CJSON_CDECL __cdecl
+#define CJSON_STDCALL __stdcall
+
+/* export symbols by default, this is necessary for copy pasting the C and header file */
+#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL
+#elif defined(CJSON_IMPORT_SYMBOLS)
+#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL
+#endif
+#else /* !__WINDOWS__ */
+#define CJSON_CDECL
+#define CJSON_STDCALL
+
+#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)
+#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
+#else
+#define CJSON_PUBLIC(type) type
+#endif
+#endif
+
+/* project version */
+#define CJSON_VERSION_MAJOR 1
+#define CJSON_VERSION_MINOR 7
+#define CJSON_VERSION_PATCH 12
+
+#include <stddef.h>
+
+/* cJSON Types: */
+#define cJSON_Invalid (0)
+#define cJSON_False (1 << 0)
+#define cJSON_True (1 << 1)
+#define cJSON_NULL (1 << 2)
+#define cJSON_Number (1 << 3)
+#define cJSON_String (1 << 4)
+#define cJSON_Array (1 << 5)
+#define cJSON_Object (1 << 6)
+#define cJSON_Raw (1 << 7) /* raw json */
+
+#define cJSON_IsReference 256
+#define cJSON_StringIsConst 512
+
+/* The cJSON structure: */
+typedef struct cJSON
+{
+ /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
+ struct cJSON *next;
+ struct cJSON *prev;
+ /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
+ struct cJSON *child;
+
+ /* The type of the item, as above. */
+ int type;
+
+ /* The item's string, if type==cJSON_String and type == cJSON_Raw */
+ char *valuestring;
+ /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
+ int valueint;
+ /* The item's number, if type==cJSON_Number */
+ double valuedouble;
+
+ /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
+ char *string;
+} cJSON;
+
+typedef struct cJSON_Hooks
+{
+ /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
+ void *(CJSON_CDECL *malloc_fn)(size_t sz);
+ void (CJSON_CDECL *free_fn)(void *ptr);
+} cJSON_Hooks;
+
+typedef int cJSON_bool;
+
+/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
+ * This is to prevent stack overflows. */
+#ifndef CJSON_NESTING_LIMIT
+#define CJSON_NESTING_LIMIT 1000
+#endif
+
+/* returns the version of cJSON as a string */
+CJSON_PUBLIC(const char*) cJSON_Version(void);
+
+/* Supply malloc, realloc and free functions to cJSON */
+/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
+/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
+/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
+/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
+/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
+CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);
+/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
+/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
+/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
+/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
+BOOL filehelper::getfiles_bynames_findin_subfolder( IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC &vtnames, IN STR_VEC *pvtfiles )
+{
+ // 路径不存在;
+ if (!PathFileExists(lpfolder))
+ return FALSE;
+
+ // 指针空;
+ if (pvtfiles == NULL) return FALSE;
+ m_pvtfiles = pvtfiles;
+
+#if USE_IMGEXT
+ // 判断扩展名有效性;
+ if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+ findfiles_findin_subfolder(lpfolder);
+ if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+ {// 需要保留指定后缀;
+ keepdownbyext(lpfindext, *pvtfiles);
+ }
+
+ // 再按名称过滤;
+ filterbyname(*pvtfiles, vtnames);
+
+ return TRUE;
+}
+
+BOOL filehelper::getfiles_bynames_findout_subfolder( IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC &vtnames, IN OUT STR_VEC *pvtfiles )
+{
+ // 路径不存在;
+ if (!PathFileExists(lpfolder))
+ return FALSE;
+
+ // 指针空;
+ if (pvtfiles == NULL) return FALSE;
+ m_pvtfiles = pvtfiles;
+
+#if USE_IMGEXT
+ // 判断扩展名有效性;
+ if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+
+ findfiles_findout_subfolder(lpfolder);
+ if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+ {// 需要保留指定后缀;
+ keepdownbyext(lpfindext, *pvtfiles);
+ }
+
+ // 再按名称过滤;
+ filterbyname(*pvtfiles, vtnames);
+
+ return TRUE;
+}
+
+BOOL filehelper::getfiles_bynames_within_subfolder( IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC &vtnames, IN STR_VEC *pvtfiles, IN STR_VEC *pvtfolders )
+{
+ // 路径不存在;
+ if (!PathFileExists(lpfolder))
+ return FALSE;
+
+ // 指针空;
+ if (pvtfiles == NULL) return FALSE;
+ m_pvtfiles = pvtfiles;
+ m_pvtfolders = pvtfolders;
+#if USE_IMGEXT
+ // 判断扩展名有效性;
+ if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+
+ findfiles_within_subfolder(lpfolder);
+ if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+BOOL filehelper::getfilesnames_findin_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtfiles, IN STR_VEC *pvtnames)
+{
+ // 路径不存在;
+ if (!PathFileExists(lpfolder))
+ return FALSE;
+
+ // 指针空;
+ if (pvtnames || !pvtnames) return FALSE;
+ m_pvtfiles = pvtfiles;
+ m_pvtnames = pvtnames;
+#if USE_IMGEXT
+ // 判断扩展名有效性;
+ if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+ findfilesnames_findin_subfolder(lpfolder);
+ if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+ {// 需要保留指定后缀;
+ keepdownbyext(lpfindext, *pvtnames);
+ keepdownbyext(lpfindext, *pvtfiles);
+ }
+
+ return TRUE;
+}
+
+BOOL filehelper::getfilesnames_findout_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtfiles, IN STR_VEC *pvtnames)
+{
+ // 路径不存在;
+ if (!PathFileExists(lpfolder))
+ return FALSE;
+
+ // 指针空;
+ if (pvtnames || !pvtnames) return FALSE;
+ m_pvtfiles = pvtfiles;
+ m_pvtnames = pvtnames;
+#if USE_IMGEXT
+ // 判断扩展名有效性;
+ if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+ findfilesnames_findout_subfolder(lpfolder);
+ if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+ {// 需要保留指定后缀;
+ keepdownbyext(lpfindext, *pvtnames);
+ keepdownbyext(lpfindext, *pvtfiles);
+ }
+
+ return TRUE;
+}
+
+BOOL filehelper::getfilesnames_within_subfolder(IN LPCTSTR lpfolder, IN LPCTSTR lpfindext, IN STR_VEC *pvtfiles, IN STR_VEC *pvtnames, IN STR_VEC *pvtfolders)
+{
+ // 路径不存在;
+ if (!PathFileExists(lpfolder))
+ return FALSE;
+
+ // 指针空;
+ if (pvtnames || !pvtnames) return FALSE;
+ m_pvtfiles = pvtfiles;
+ m_pvtnames = pvtnames;
+ m_pvtfolders = pvtfolders;
+#if USE_IMGEXT
+ // 判断扩展名有效性;
+ if (!iscorrectext(lpfindext)) return FALSE;
+#endif
+ findfilesnames_within_subfolder(lpfolder);
+ if (lpfindext && _tcsstr(lpfindext, _T("*.*")) == NULL )
+ for (STR_VEC::iterator it = vtnames.begin(); it != vtnames.end(); it++)
+ {
+ if (comparename_findin_files(it->c_str(), vtfiles))
+ {
+ if (pvtIsonym)
+ pvtIsonym->push_back(*it);
+ nCount++;
+ }
+ }
+
+ return nCount;
+}
+
+INT filehelper::comparenames_findin_folder(IN STR_VEC vtnames, IN LPCTSTR folder, IN BOOL bsubfolder, IN LPCTSTR findext, OUT STR_VEC *pvtIsonym /* = NULL */)
+{
+ if (vtnames.size() == 0 || !PathFileExists(folder)) return 0;
+ for (STR_VEC::iterator it = vtfiles1.begin(); it != vtfiles1.end(); it++)
+ {
+ name = getfilename(*it);
+ if (comparename_findin_files(name.c_str(), vtfiles2))
+ {
+ if (pvtIsonym)
+ pvtIsonym->push_back(name);
+ nCount++;
+ }
+ }
+
+ return nCount;
+}
+
+INT filehelper::comparefiles_findin_folder(IN STR_VEC &vtfiles, IN LPCTSTR folder, IN BOOL bsubfolder, IN LPCTSTR findext, OUT STR_VEC *pvtIsonym /* = NULL */)
+ for (STR_VEC::iterator it = pvtfiles[i].begin(); it != pvtfiles[i].end(); it++)
+ {
+ name = getfilename(*it);
+ if (comparename_findin_names(name.c_str(), vtnames))
+ {
+ // 打印日志,提示客户重名的相片;
+ OutputDebugString(it->c_str());
+ OutputDebugString(_T("\n"));
+ pvtIsonym->push_back(it->c_str());
+ }
+ else
+ {
+ vtnames.push_back(name);
+ }
+ }
+ }
+
+ if (pvtfiles)
+ delete []pvtfiles;
+ pvtfiles = NULL;
+
+ return 0;
+}
+
+INT filehelper::comparefolder_findin_folder(IN LPCTSTR folder1, IN LPCTSTR folder2, IN BOOL bsubfolder, IN LPCTSTR findext, OUT STR_VEC *pvtIsonym /* = NULL */)
+{
+ return 0;
+}
+
+INT filehelper::copyfolder(IN LPCTSTR from, IN LPCTSTR to)
+{
+ if (to == NULL || from == NULL)
+ return -1;
+
+ // 创建目录;
+ int nleft = 0;
+ int nIndex = -1;
+ TString strTo = to;
+ if (strTo.at(strTo.size()-1) != _T('\\'))
+ strTo.append(_T("\\"));
+ // 共享路径和硬盘盘符;
+ if (_tcscmp(strTo.substr(0, 2).c_str(), _T("\\\\")) == 0)