⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readscanbasethd.cpp

📁 一个我自己写的多语言工具,可以用于JAVA,VC的多语言话,可以提取所有文字资源,不破坏源文件的注释
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ReadScanBaseThd.cpp : implementation file
//

#include "stdafx.h"
#include "scanstringtool.h"
#include "ReadScanBaseThd.h"
#include "FileLine.h"
#include "ReplaceThd.h"
#include "WriteFileThd.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CReadScanBaseThd

IMPLEMENT_DYNAMIC(CReadScanBaseThd, CWinThread)

CReadScanBaseThd::CReadScanBaseThd(CScanstringtoolDlg* hDlg)
{
	m_hDlg = hDlg;
	m_bAutoDelete = FALSE;
	m_bStopScan = FALSE;
	m_hEventKill = CreateEvent(NULL, TRUE, FALSE, NULL);
	m_hEventDead = CreateEvent(NULL, TRUE, FALSE, NULL);
	m_hEventStart = CreateEvent(NULL, TRUE, FALSE, NULL);
	m_hEventRead = CreateEvent(NULL, TRUE, FALSE, NULL);
	m_hEventReplace = CreateEvent(NULL, TRUE, FALSE, NULL);
//	SetEvent(m_hEventRead);
	CReplaceThd* pReplaceThd = new CReplaceThd(m_hDlg,this);
	CWriteFileThd* pWriteThd = new CWriteFileThd(pReplaceThd,this);
	pWriteThd->CreateThread(); //启动写文件线程
	pReplaceThd->CreateThread(); //启动扫描线程
	m_pReplaceThd = (void*)pReplaceThd;
	m_pWriteThd = pWriteThd;
}

CReadScanBaseThd::~CReadScanBaseThd()
{
	CloseHandle(m_hEventDead);
	CloseHandle(m_hEventKill);
	CloseHandle(m_hEventStart);
	CloseHandle(m_hEventRead);
	CloseHandle(m_hEventReplace);
}

BOOL CReadScanBaseThd::InitInstance()
{
	// TODO:  perform and per-thread initialization here
	DWORD ret;
	HANDLE Handles[] = { m_hEventKill, 
		m_hEventStart };
	
	for (;;)
	{
		ret = WaitForMultipleObjects(2, Handles, false, INFINITE);
		if (ret == WAIT_OBJECT_0 )	// End Task
		{
			VERIFY(SetEvent(m_hEventDead));
			break;
		}
		else if (ret == WAIT_OBJECT_0+1 ) // Receive start task Event
		{
			m_hDlg->m_lFileNum = 1;
			ReadFileList(m_hDlg->m_dir);
			EndTask();
		}
	}
	return TRUE;
}

int CReadScanBaseThd::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CReadScanBaseThd, CWinThread)
	//{{AFX_MSG_MAP(CReadScanBaseThd)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CReadScanBaseThd message handlers

void CReadScanBaseThd::KillThread()
{
	VERIFY(SetEvent(m_hEventKill));
	
	// allow thread to run at higher priority during kill process
	SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
	WaitForSingleObject(m_hEventDead, 2000);
	WaitForSingleObject(m_hThread, 1000);

	CWriteFileThd* pWriteThd = (CWriteFileThd*)m_pWriteThd;
	if(pWriteThd !=NULL)
		pWriteThd->KillThread();

	CReplaceThd* pReplaceThd = (CReplaceThd*)m_pReplaceThd;
	if(pReplaceThd !=NULL)
		pReplaceThd->KillThread();

	delete this;
}


// Function name	: CReadScanBaseThd::ReadFileList
// Description	    : 2005-2-26读取文件到内存并做第一次扫描
// Author			: fanduansheng
// Input			: 
// Output			: 
// Return type		: long 
// Argument         : CString szSourceDir
long CReadScanBaseThd::ReadFileList(CString szSourceDir)
{
	long lPackageSize = 0;
	long ltempsize = 0;
	CString szFileName;
	szFileName.Empty();
	HANDLE hFind;
	WIN32_FIND_DATA fd;
	CString szSource;
	szSource.Empty();

	if (szSourceDir.Right(1) != "\\")
		szSourceDir += "\\" ;
	szSource = szSourceDir + "*.*" ;
	if ((hFind = ::FindFirstFile ((LPCSTR)szSource, &fd)) == INVALID_HANDLE_VALUE)
		return lPackageSize;
	/* Get the name of the directory's contents */
	do 
	{
		if(m_bStopScan) //结束扫描
			break;
		szFileName = (LPCTSTR) &fd.cFileName;
		/* If content is a sub directory */
		if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			if ( (szFileName != ".") && (szFileName != "..") ) //如果目录
			{
				if(m_hDlg == NULL) 
					break;
				if(m_hDlg->m_bSubFolder)
					ReadFileList(szSourceDir+szFileName);
			}
		}
		else /* If content is a file */
		{
			if(!IsFileType(szFileName))
			{
				continue;
			}
			CString stmp= szSourceDir+ szFileName;
			m_hDlg->m_ctlDsp.SetWindowText(stmp);
			ScanFile(stmp);
			CString szNfile;
			szNfile.Format("%ld",m_hDlg->m_lFileNum);
			m_hDlg->m_ctlFileNum.SetWindowText(szNfile);
			m_hDlg->m_lFileNum++;
			WaitForSingleObject(m_hEventRead,INFINITE);
		}
		lPackageSize += fd.nFileSizeLow;
	} while (::FindNextFile (hFind, &fd));
	::FindClose (hFind);

	return lPackageSize;
}


// Function name	: CReadScanBaseThd::ScanFile
// Description	    : 2005-2-26扫描一个文件把行归类,并分析出注释把文件读入到内存
// Author			: fanduansheng
// Input			: 
// Output			: 
// Return type		: void 
// Argument         : CString szFileName
void CReadScanBaseThd::ScanFile(CString szFileName)
{

	ResetEvent(m_hEventRead);//扫描开始
	long lFileLine = 0; //文件行
	int iLineStatus = LTYPE_NORMAL; //行状态
	char szBuff[4096]; //行缓冲
	memset(szBuff,0,sizeof(szBuff));
	
	int iStatusMachine = 0; //初始状态为原始无状态

	FILE* fp = NULL;
	fp = fopen(szFileName,"r");
	if(fp == NULL) 
	{
		//不扫描
		return;
	}
	FileLine* startLine  = new FileLine();
	strcpy(startLine->m_szFileName ,szFileName);
	startLine->m_bLineType = LTYPE_START;
	theApp.m_CS.Lock();
	theApp.m_originListMsg.AddTail(startLine); 
	theApp.m_CS.Unlock();
	SetEvent(m_hEventReplace);
	CString tmpFile = szFileName;
	tmpFile.MakeLower();
	BOOL bIsResource = 	(tmpFile.Find("resource.h") != -1);
	if(bIsResource && theApp.m_lMacroValue == MAX_MARCO_VALUE)
	{
		theApp.m_lMacroValue = 1;
	}
		
	while(!feof(fp))
	{
		fgets(szBuff,sizeof(szBuff),fp);
		if(feof(fp) && strchr(szBuff,0x0a)!=NULL)
			break;
		if(bIsResource)
		{
			long tmpLv=0;
			char szTmp[4096];
			sscanf(szBuff,"#define%s%ld",szTmp,&tmpLv);
			if(tmpLv > theApp.m_lMacroValue)
				theApp.m_lMacroValue = tmpLv;
		}
		lFileLine++;

		//过虑注释
		char szNoteBuff[4096]; //注释缓冲
		memset(szNoteBuff,0,sizeof(szNoteBuff));
		char szClassBuff[4096];//类名缓冲
		memset(szClassBuff,0,sizeof(szClassBuff));
		char szOtherBuff[4096]; //其他正常字符缓冲
		memset(szOtherBuff,0,sizeof(szOtherBuff));
		
		int i = 0; //行顺序计数
		int iNote = 0;//注释字符计数
		int iClass = 0;//类名注释
		int iOther = 0; //正常字符缓冲
		char cForward = '\0'; //前一字符缓冲
		BOOL bBias = false;
		int iQuote = 0;

		GetLineClass(szFileName,szBuff,szClassBuff);
		if(iLineStatus == LTYPE_NORMAL &&  \
			(strstr(szBuff,"")==NULL || strstr(szBuff,"")==NULL) )
		{
			FileLine* normalLine  = new FileLine();
			strcpy(normalLine->m_szFileName ,szFileName);
			strcpy(normalLine->m_szClassName, szClassBuff);
			normalLine->m_bLineType = LTYPE_NORMAL;
			normalLine->m_lLineNum = lFileLine;
			strcpy(normalLine->m_szLineBuf, szBuff);
			memset(szBuff,0,sizeof(szBuff));
			theApp.m_CS.Lock();
			theApp.m_originListMsg.AddTail(normalLine);
			theApp.m_CS.Unlock();
			SetEvent(m_hEventReplace);
			continue;
		}
		while(true)
		{
		//	char szTemp[4096];
			if(iLineStatus == LTYPE_NOTE )
			{
				szNoteBuff[iNote++] = szBuff[i];
			}
			else
			{
				if(iQuote ==  0 && szBuff[i] =='"')
				{
					iQuote = 1;
				}
				else if(iQuote ==  1 && szBuff[i] =='"')
				{
					iQuote = 0;
				}
				//把多余的注释符号去掉
				if(iOther != 0 )
				{
					if( (szOtherBuff[iOther - 1 ] == '/' && szBuff[i] == '*') || \
						(szOtherBuff[iOther - 1 ] == '/' && szBuff[i] == '/') )
					{
						iOther--;
						szOtherBuff[iOther] = 0;
					}
					else
					{
						szOtherBuff[iOther++] = szBuff[i];
					}
				}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -