www.pudn.com > NETINFO.rar > tools.cpp


//write buffer of length to filename 
BOOL WriteBufferToFile(const char* fileName, void*buffer, DWORD length) 
{ 
	BOOL result = FALSE; 
	FILE* fp = fopen(fileName, "wb"); 
	if( fp ) 
	{ 
		if( fwrite(buffer, 1, length, fp) == length ) 
			result = TRUE; 
		fclose(fp); 
	} 
	return result; 
} 
 
//return true if file remained 
//else return false 
BOOL DeleteEmptyFile(const char* filename) 
{ 
	BOOL remained = FALSE; 
	WIN32_FIND_DATA findData; 
	HANDLE hFind = FindFirstFile(filename, &findData); 
	if( hFind != INVALID_HANDLE_VALUE ) 
	{ 
		FindClose(hFind); 
		if( findData.nFileSizeHigh == 0 && findData.nFileSizeLow == 0 ) 
		{ 
			if( !DeleteFile(filename) ) 
				remained = TRUE; 
		} 
		else 
			remained = TRUE; 
	} 
	return remained; 
} 
 
//print a binary buffer with length = count in hexical number, 
//which a line can hold at most countPerLine byte 
void PrintHexByte(FILE* fp, const BYTE* buf, DWORD count, DWORD countPerLine) 
{ 
	for(DWORD i=0; i=0; i--) 
		if( dosFileName[i] == '/' ) dosFileName[i] = '\\'; 
} 
 
//precreate path for creating a file 
void CreateFilePath(const char fileName[MAX_PATH]) 
{ 
	char temp[MAX_PATH]; 
	strcpy(temp, fileName); 
	int len = strlen(temp); 
	for(int i = 0; i=0 && filename[i]!='\\' && filename[i]!=':' && filename[i]!='/';  
		i--)NULL; 
	memcpy(fileDir, filename, i+1); 
	fileDir[i+1] = 0; 
} 
 
BOOL ExistFileOrDirectory(const char filename[MAX_PATH]) 
{ 
	BOOL result = FALSE; 
	WIN32_FIND_DATA findData; 
	HANDLE hFind = FindFirstFile(filename, &findData); 
	if( hFind != INVALID_HANDLE_VALUE ) 
	{ 
		result = TRUE; 
		FindClose(hFind); 
	} 
	return result; 
} 
 
BOOL ExistFile(const char filename[MAX_PATH]) 
{ 
	BOOL result = FALSE; 
	WIN32_FIND_DATA findData; 
	HANDLE hFind = FindFirstFile(filename, &findData); 
	if( hFind != INVALID_HANDLE_VALUE ) 
	{ 
		if( (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY ) 
			result = TRUE; 
		FindClose(hFind); 
	} 
	return result; 
} 
 
BOOL ExistDirectory(const char filename[MAX_PATH]) 
{ 
	BOOL result = FALSE; 
	WIN32_FIND_DATA findData; 
	HANDLE hFind = FindFirstFile(filename, &findData); 
	if( hFind != INVALID_HANDLE_VALUE ) 
	{ 
		if( (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY ) 
			result = TRUE; 
		FindClose(hFind); 
	} 
	return result; 
} 
 
void GetTempFullFileName(char filepath[MAX_PATH]) 
{ 
	char tempPath[MAX_PATH]; 
	GetTempPath(sizeof(tempPath), tempPath); 
	GetTempFileName(tempPath, "FTP", 0, filepath); 
} 
 
BOOL GetFileLength(const char filename[MAX_PATH], DWORD*pFileLength) 
{ 
	*pFileLength = 0; 
	BOOL result = FALSE; 
	WIN32_FIND_DATA findData; 
	HANDLE hFind = FindFirstFile(filename, &findData); 
	if( hFind != INVALID_HANDLE_VALUE ) 
	{ 
		if( (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY ) 
		{ 
			*pFileLength = findData.nFileSizeLow; 
			result = TRUE; 
		} 
		FindClose(hFind); 
	} 
	return result; 
} 
 
 
#define GET_UPPER_CHAR(c) ( ('a'<=(c)&&(c)<='z') ? (c)-'a'+'A' : (c) ) 
//if string include begin at the begin, return TRUE, else return FALSE 
BOOL BeginWith(const char*string, const char*begin, BOOL bCaseSensitive) 
{ 
	if( bCaseSensitive ) 
	{ 
		for(int i=0; begin[i]!=0 && begin[i] == string[i]; i++)NULL; 
		if( begin[i] == 0 ) 
			return TRUE; 
		else 
			return FALSE; 
	} 
	else 
	{ 
		for(int i=0; begin[i]!=0 && GET_UPPER_CHAR(begin[i]) == GET_UPPER_CHAR(string[i]); i++)NULL; 
		if( begin[i] == 0 ) 
			return TRUE; 
		else 
			return FALSE; 
	} 
} 
 
 
struct TYPE_SUBTYPE_EXT 
{ 
	char* type; 
	char* subtype; 
	char* ext; 
}; 
 
static int MimeTypeCompare(const void *elem1, const void *elem2) 
{ 
	int result1 = stricmp( ((TYPE_SUBTYPE_EXT*)elem1)->type, ((TYPE_SUBTYPE_EXT*)elem2)->type ); 
	if( result1 != 0 )return result1; 
	return stricmp( ((TYPE_SUBTYPE_EXT*)elem1)->subtype, ((TYPE_SUBTYPE_EXT*)elem2)->subtype); 
} 
 
BOOL GetExtFromMimeType(const char type[], const char subType[], char ext[MAX_PATH]) 
{ 
	const static TYPE_SUBTYPE_EXT typeToExt[] = 
	{ 
		{"application", "msword", "doc"}, 
		{"application", "octect-stream", "dat"}, 
		{"application", "pdf", "pdf"}, 
 
		{"image", "gif", "gif"}, 
		{"image", "jpeg", "jpg"}, 
		{"image", "png", "png"}, 
		{"image", "tiff", "tif"}, 
 
		{"text", "html", "htm"}, 
		{"text", "plain", "txt"}, 
		{"text", "rtf", "rtf"}, 
		{"text", "xml", "xml"}, 
 
		{"video", "mpeg", "mpg"}, 
	}; 
	const static size_t nTypeCount = sizeof(typeToExt)/sizeof(typeToExt[0]); 
	 
	TYPE_SUBTYPE_EXT key; 
	key.type = (char*)type; 
	key.subtype = (char*)subType; 
	TYPE_SUBTYPE_EXT *pFind = (TYPE_SUBTYPE_EXT*)bsearch(&key, typeToExt,  
										nTypeCount, sizeof(TYPE_SUBTYPE_EXT), 
										MimeTypeCompare); 
	if( pFind ) 
		strcpy(ext, pFind->ext); 
	else 
	{ 
		if( stricmp(type, "text") ) 
			sprintf(ext, "%s.txt", subType); 
		else 
			sprintf(ext, "%s.%s.dat", type, subType); 
	} 
	return TRUE; 
} 
 
void GetPureFileName(const char szFilepath[], char szFilename[]) 
{ 
	for(int i=strlen(szFilepath)-1;  
			i>=0 && szFilepath[i] != '\\' && szFilepath[i] != '/' && szFilepath[i] != ':'; 
			i--) NULL; 
	strcpy(szFilename, szFilepath + i + 1); 
} 
 
void AppendToFile(const char* szFilename, const char* szData) 
{ 
	FILE* fp = fopen(szFilename, "at"); 
	if( fp ) 
	{ 
		fprintf(fp, "%s\r\n", szData); 
		fclose(fp); 
	} 
} 
 
BOOL SplitStringPair(const char line[], char separate,  
					 char name[], int nNameLen, 
					 char value[], int nValueLen) 
{ 
	const char *pColon = strchr(line, separate); 
	if( !pColon ) //because I have found some cases that is using '=' as seperator 
		pColon = strchr(line, '='); 
	if( !pColon ) return FALSE; 
	const char *pStart, *pEnd; 
 
	//extract name 
	for(pStart = line; pStart=pStart && isspace(*pEnd); pEnd--)NULL; //skip end space 
	if(pEnd>=pStart && pEnd - pStart + 2 < nNameLen ) 
	{ 
		memcpy(name, pStart, pEnd-pStart+1); 
		name[pEnd-pStart+1] = 0; 
	} 
	else 
		strcpy(name, ""); 
 
	//extract value 
	const char* pZero = pColon + strlen(pColon); 
	for(pStart = pColon+1; pStart=pStart && isspace(*pEnd); pEnd--)NULL; //skip end space 
	if(pEnd>=pStart && pEnd - pStart + 2 < nValueLen ) 
	{ 
		memcpy(value, pStart, pEnd-pStart+1); 
		value[pEnd-pStart+1] = 0; 
	} 
	else 
		strcpy(value, ""); 
	return TRUE; 
}