MFC中对编码文件的操作01

1、自定义类获取项目中全部对话框ID和头文件子路径

(1)、创建单例类

cpp 复制代码
public:
static SetAllChinesefunctions*Instance();
private:
static SetAllChinesefunctions*_Instance;


SetAllChinesefunctions*SetAllChinesefunctions::Instance()
{
    if(nullptr == _Instance)
    {
        _Instance = new SetAllChinesefunctions;
    }
    return _Instance;
}

(2)、查找CFileFind类

这个类用于查找指定根目录下面的文件和文件夹,或者特定的文件。

1)、FindFile 函数会返回一个BOOL值,如果为1说明当前路径下还有文件或文件夹。参数是你指定的目录。

2)、FindNextFile函数,无参数,查找下一个文件或者文件夹。

3)、IsDots函数,无参数,用于判断当前文件夹是不是.或者..目录,是返回1。

4)、IsDirectory函数,无参数,用于判断当前是不是文件夹,是文件夹返回1。

cpp 复制代码
CFileFind finder;
	CString searchPath = sPrjRoot + _T("\\*");//指定要去查找的路径
	BOOL bWorking = finder.FindFile(searchPath);//查找当前路径下面的文件和文件夹
	while (bWorking)
	{
		bWorking = finder.FindNextFile();

		if (finder.IsDots()) continue;

		if (finder.IsDirectory())
		{
			_iterfind(finder.GetFilePath());
			continue;
		}

		// 查找.h文件
		CString sFileName = finder.GetFileName();
		if (sFileName.Right(2).MakeLower() == _T(".h"))
		{
			_findDlgID(finder.GetFilePath());
		}
	}

(3)、当前类CFindDlgIDAndClassFile全部代码

cpp 复制代码
#pragma once
#include <map>
#include"../TMLCHelper/StdioFileCodePage.h"

class CFindDlgIDAndClassFile
{
public:
	CFindDlgIDAndClassFile();
	~CFindDlgIDAndClassFile();
	static CFindDlgIDAndClassFile* Instance();
	void Find(const CString& sPrjRoot);

	bool IsExistDlgID(const CString& sID)
	{
		return(m_mapDlgIDAndClassFile.find(sID) != m_mapDlgIDAndClassFile.end());
	}
	
private:
	static CFindDlgIDAndClassFile* _Instance ;
	void _iterfind(const CString& sPrjRoot);
	void _findDlgID(const CString& sFileH);
	CString m_sRootPath;
public:
	std::map<CString, CString> m_mapDlgIDAndClassFile;   // 对话框ID - 类文件子路径
};

#define FINDDLGANDCLASS (*CFindDlgIDAndClassFile::Instance())
cpp 复制代码
#include "stdafx.h"
#include "FindDlgIDAndClassFile.h"
#include <fstream>
#include <string>

//CFindDlgIDAndClassFile* _Instance = nullptr;

CFindDlgIDAndClassFile::CFindDlgIDAndClassFile()
{
}


CFindDlgIDAndClassFile::~CFindDlgIDAndClassFile()
{
}
CFindDlgIDAndClassFile* CFindDlgIDAndClassFile::_Instance = nullptr;  // 初始化 _Instance 为 nullptr
CFindDlgIDAndClassFile* CFindDlgIDAndClassFile::Instance()
{
	if (nullptr == _Instance)
	{
		_Instance = new CFindDlgIDAndClassFile;
	}

	return _Instance;
}

void CFindDlgIDAndClassFile::Find(const CString& sPrjRoot)
{
	m_sRootPath = sPrjRoot;
	m_mapDlgIDAndClassFile.clear();
	_iterfind(sPrjRoot);
}


void CFindDlgIDAndClassFile::_iterfind(const CString& sPrjRoot)
{
	CFileFind finder;
	CString searchPath = sPrjRoot + _T("\\*");//指定要去查找的路径
	BOOL bWorking = finder.FindFile(searchPath);//查找当前路径下面的文件和文件夹
	while (bWorking)
	{
		bWorking = finder.FindNextFile();

		if (finder.IsDots()) continue;

		if (finder.IsDirectory())
		{
			_iterfind(finder.GetFilePath());
			continue;
		}

		// 查找.h文件
		CString sFileName = finder.GetFileName();
		if (sFileName.Right(2).MakeLower() == _T(".h"))
		{
			_findDlgID(finder.GetFilePath());
		}
	}
}

void CFindDlgIDAndClassFile::_findDlgID(const CString& sFileH)
{
	CString sFilePath = sFileH;
	bool bDesignTime = false;

	CString stxt;
	CStdioFileCodePage file;
	file.OpenWithoutType(sFileH, CFile::modeRead);
	file.JumpBOM();
	while (file.ReadStringWithOutType(stxt))
	{
			int ipos1 = stxt.Find(_T("IDD ="));
			int ipos2 = stxt.Find(_T("IDD="));
			if (ipos1 != -1 || ipos2 != -1)
			{
				int ipos = (ipos1 > 0) ? (ipos1 + 5) : (ipos2 + 4);
				int ipose = stxt.Find('}', ipos);
				CString sID;
				if (ipose == -1)
				{
					 sID=stxt.Mid(ipos);
				}
				else
				{
					 sID = stxt.Mid(ipos, ipose - ipos);
				}
				
				sID.TrimLeft();
				sID.TrimRight();
				sFilePath.Replace(m_sRootPath, _T(""));
				sFilePath.Replace(L".h", _T(""));
				m_mapDlgIDAndClassFile[sID] = sFilePath;
				file.Close();
				return;
			}
	}
}
相关推荐
EleganceJiaBao几秒前
【C语言】结构体模块化编程
c语言·c++·模块化·static·结构体·struct·耦合
xianwu54315 分钟前
反向代理模块。开发
linux·开发语言·网络·c++·git
Bucai_不才37 分钟前
【C++】初识C++之C语言加入光荣的进化(上)
c语言·c++·面向对象
木向39 分钟前
leetcode22:括号问题
开发语言·c++·leetcode
筑基.1 小时前
basic_ios及其衍生库(附 GCC libstdc++源代码)
开发语言·c++
yuyanjingtao1 小时前
CCF-GESP 等级考试 2023年12月认证C++三级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
王老师青少年编程2 小时前
gesp(二级)(12)洛谷:B3955:[GESP202403 二级] 小杨的日字矩阵
c++·算法·矩阵·gesp·csp·信奥赛
2402_857583493 小时前
“协同过滤技术实战”:网上书城系统的设计与实现
java·开发语言·vue.js·科技·mfc
OTWOL3 小时前
两道数组有关的OJ练习题
c语言·开发语言·数据结构·c++·算法
QQ同步助手4 小时前
C++ 指针进阶:动态内存与复杂应用
开发语言·c++