创建MFC自用工具类kit
前言
近期在尝试开发MFC
,由于有些功能用到的频率比较高,但又比较零散,因此将这些小功能整合到自己创建的工具类kit
,由于之前MFC
用的不多,因此水平有限,还请看到的大佬不要吐槽,多多指教。
文件结构说明
kit工具类
,由头文件kit.h和实现文件kit.cpp组成,kit仅有static函数,不支持实例化。
头文件声明
先放出头文件kit.h
的声明源码:
#pragma once
class kit
{
public:
kit(void);
~kit(void);
//文件路径字符串判断
static CString GetRunDir(void);//获取运行目录路径
//解析文件路径,输出文件名Name [+ 目录Dir + 扩展名Ext + 盘符Disk + 无后缀文件名NameNoExt]
static int ParsePath(const CString& Path, CString& Name, CString& Dir=(CString)_T(""), CString& Ext=(CString)_T(""), CString& Disk=(CString)_T(""), CString& NameNoExt=(CString)_T(""));
static BOOL ValidPath(const CString &path);//判断路径字符串是否合法
static BOOL ValidFileName(const CString &name);//判断文件名字符串是否合法
static BOOL ValidDir(const CString &dir);//判断目录字符串是否合法
//文件处理
enum FileType {
TYPE_NOTEXIST, TYPE_FILE, TYPE_FOLDER};//路径属性:0不存在此路径; 1此路径为文件; 2此路径为目录
static FileType CheckPath(const CString& path);//判断路径属性
//文件编码
enum FileEncode {
UNKNOWN_ENCODE, GBK, UNICODE_LE, UNICODE_BE, UTF8, UTF8_NOBOM };
static UINT GetUtf8Len(const PBYTE utf8, UINT len = 0U);/* 获取一段UTF8文本的字节数 */
static BOOL IsUnicodeWithoutBOM(const PBYTE pText, UINT length = 0U);/* 判断一段BYTE数组是否为无BOM的UTF8格式 */
static FileEncode DetectEncode(const PBYTE pBuffer, UINT length = 0U);/* 判断一段文本BYTE数组的编码 */
static FileEncode GetFileEncode(LPCTSTR FilePath);/* 获取文本文件编码 */
static BOOL SetFileEncode(LPCTSTR FilePath, FileEncode Encode);/* 设置文本文件编码 */
static BOOL IsGbk(const PBYTE str, UINT len = 2U);/* 判断一段字符串是否符合GBK特征 */
//GBK、UTF8转UNICODE
static CString Utf8ToUnicode(const char* Utf8, int Utf8Len = -1);/* UTF-8到Unicode的转换 */
static CString GbkToUnicode(const char* Gbk, int GbkLen = -1);/* GBK到Unicode的转换 */
//UNICODE转GBK、UTF8
static char* UnicodeToGbk(UINT* GbkLen, const wchar_t* Unicode, int UnicodeLen = -1);/* Unicode转Gbk,用完记得free掉返回的指针 */
static char* UnicodeToGbk(CString Unicode, UINT* GbkLen = NULL);/* Unicode转Gbk,用完记得free掉返回的指针 */
static char* UnicodeToUtf8(UINT* Utf8Len, const wchar_t* Unicode, int UnicodeLen = -1);/* Unicode转Utf8,用完记得free掉返回的指针 */
static char* UnicodeToUtf8(CString Unicode, UINT* Utf8Len = NULL);/* Unicode转Utf8,用完记得free掉返回的指针 */
//GBK、UTF8互转
static char* Utf8ToGbk(UINT* GbkLen, const char* Utf8, int Utf8Len = -1);/* Utf8转Gbk,用完记得free掉返回的指针 */
static char* GbkToUtf8(UINT* Utf8Len, const char* Gbk, int GbkLen = -1);/* Gbk转Utf8,用完记得free掉返回的指针 */
static const UINT MAX_FILE_LENGTH = 4 * 1024 * 1024;//文件最长文本长度4MB
static const char* const UTF8_BOM_HEADER;
//INI文件操作
static BOOL IniDelete(const CString &Filename, const CString &Section, const CString &Key = _T(""));
static BOOL IniRead(const CString &Filename, const CString &Section, const CString &Key, CString &value);
static BOOL IniWrite(const CString &Filename, const CString &Section, const CString &Key, const CString &value);
};
函数实现
通用声明
static const TCHAR InvalidCharOfFileName[] = {
'\\', '/', ':', '*', '?', '\"', '<', '>', '|'};
static const TCHAR InvalidCharOfPath[] = {
'/', '*', '?', '\"', '<', '>', '|'};
const char* const kit::UTF8_BOM_HEADER = "\xEF\xBB\xBF";
一、路径类接口
1.GetRunDir
使用GetModuleFileName
获取当前运行程序路径。
CString kit::GetRunDir(void)
{
CString path;
GetModuleFileName(NULL, path.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
path.ReleaseBuffer();
int pos = path.ReverseFind('\\');
return path.Left(pos);
}
2.ParsePath
解析获取路径中的相关内容(如文件名、文件上一级目录路径、文件扩展名、盘符、和无后缀名的文件名)
int kit::ParsePath(const CString& Path, CString& Name, CString& Dir, CString& Ext, CString& Disk, CString& NameNoExt)
{
if(Path == _T(""))//空字符串
return