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;
}