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

📄 findpage.cpp

📁 对文件进行处理。 包括文件复制、分割、连接、查看等。
💻 CPP
字号:
// FindPage.cpp : implementation file
//

#include "stdafx.h"
#include "Made.h"
#include "FindPage.h"

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

/////////////////////////////////////////////////////////////////////////////
// CFindPage property page
UINT FindPro(LPVOID lpParam)
{
	CFindPage * p=(CFindPage *)lpParam;
	p->Find();
	p->GetDlgItem(IDC_FIND_STOP)->EnableWindow(0);
	p->GetDlgItem(IDC_FIND_PAUSE)->EnableWindow(0);
	p->GetDlgItem(IDC_FIND)->EnableWindow();
	p->GetDlgItem(IDC_FIND_STR)->EnableWindow();
	p->GetDlgItem(IDC_FIND_WORD)->EnableWindow();
	p->GetDlgItem(IDC_FIND_ASC)->EnableWindow();
	p->GetDlgItem(IDC_FIND_SIT)->EnableWindow();
	return 0;
}

IMPLEMENT_DYNCREATE(CFindPage, CPropertyPage)

CFindPage::CFindPage() : CPropertyPage(CFindPage::IDD)
{
	//{{AFX_DATA_INIT(CFindPage)
	m_Findflag = 0;
	m_AscStr = _T("");
	m_FindStr = _T("");
	m_Sit = _T("");
	//}}AFX_DATA_INIT
	pfile=0;
}

CFindPage::~CFindPage()
{
}

void CFindPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFindPage)
	DDX_Control(pDX, IDC_FIND_PROGRESS, m_Progress);
	DDX_Control(pDX, IDC_FIND_PAUSE, m_Pause);
	DDX_Control(pDX, IDC_FIND_FILE, m_File);
	DDX_Radio(pDX, IDC_FIND_WORD, m_Findflag);
	DDX_Text(pDX, IDC_FIND_ASCII, m_AscStr);
	DDX_Text(pDX, IDC_FIND_STR, m_FindStr);
	DDX_Text(pDX, IDC_FIND_SIT, m_Sit);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFindPage, CPropertyPage)
	//{{AFX_MSG_MAP(CFindPage)
	ON_BN_CLICKED(IDC_FIND_WORD, OnFineWord)
	ON_BN_CLICKED(IDC_FIND_ASC, OnFindRascii)
	ON_EN_CHANGE(IDC_FIND_STR, OnChangeFindStr)
	ON_BN_CLICKED(IDC_FIND, OnFind)
	ON_EN_CHANGE(IDC_FIND_ASCII, OnChangeFindEascii)
	ON_BN_CLICKED(IDC_FIND_LOOK, OnFindLook)
	ON_BN_CLICKED(IDC_FIND_PAUSE, OnFindPause)
	ON_BN_CLICKED(IDC_FIND_STOP, OnFindStop)
	ON_EN_KILLFOCUS(IDC_FIND_ASCII, OnKillfocusFindEascii)
	ON_EN_CHANGE(IDC_FIND_SIT, OnChangeFindSit)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFindPage message handlers

void CFindPage::OnFineWord() 
{
	UpdateData();	
	GetDlgItem(IDC_FIND_ASCII)->EnableWindow(0);
	GetDlgItem(IDC_FIND_STR)->EnableWindow();
}

void CFindPage::OnFindRascii() 
{
	UpdateData();	
	GetDlgItem(IDC_FIND_ASCII)->EnableWindow();
	GetDlgItem(IDC_FIND_STR)->EnableWindow(0);
}

void CFindPage::OnChangeFindStr() 
{
	UpdateData();
	CString str;
	m_AscStr.Empty();
	for(int i=m_FindStr.GetLength()-1;i>=0;i--)
	{
		str.Format("%d\n",m_FindStr.GetAt(i));
		m_AscStr=str+m_AscStr;
	}
	UpdateData(0);
}

void CFindPage::OnFind() 
{
	m_Progress.SetRange(0,1000);
	m_BreakFlag=0;
	GetDlgItem(IDC_FIND_STOP)->EnableWindow();
	GetDlgItem(IDC_FIND_PAUSE)->EnableWindow(0);
	GetDlgItem(IDC_FIND)->EnableWindow(0);
	GetDlgItem(IDC_FIND_STR)->EnableWindow(0);
	GetDlgItem(IDC_FIND_ASCII)->EnableWindow(0);
	GetDlgItem(IDC_FIND_WORD)->EnableWindow(0);
	GetDlgItem(IDC_FIND_ASC)->EnableWindow(0);
	GetDlgItem(IDC_FIND_SIT)->EnableWindow(0);
	AfxBeginThread(FindPro,this);
}

void CFindPage::OnChangeFindEascii() 
{
	UpdateData();	
	m_FindStr.Empty();
	if(!m_AscStr.Right(4).CompareNoCase("\r\n\r\n"))
		m_AscStr.Delete(m_AscStr.GetLength()-2,2);
	CString str=m_AscStr;
	if(str.Right(2).CompareNoCase("\r\n"))
		str+="\r\n";
	CString temps;
	int sit=0;long time=0;
	while(str.Right(1)==10)
	{
		if(time++>50){MessageBox("over 50");break;}
		sit=str.Find(13);
		temps.Format("%c",atoi(str.Left(sit)));
		m_FindStr+=temps;
		str.Delete(0,sit+2);
	}
	UpdateData(0);
}

void CFindPage::OnFindLook() 
{	
	CFileDialog file(TRUE);
	if(file.DoModal()==IDOK)
		m_File.SetWindowText(file.GetPathName());
	
}

void CFindPage::OnFindPause() 
{
	CString bname;
	m_Pause.GetWindowText(bname);
	if(bname.Left(4).CompareNoCase("继续"))
	{
		pThread->SuspendThread();
//		DWORD flag=pThread->ResumeThread();
//		CString st;st.Format("%d",flag);MessageBox(st);
		m_Pause.SetWindowText("继续");
	}
	else
	{
		pThread->ResumeThread();
		m_Pause.SetWindowText("暂停");
	}
//	CWinThread * thread=(CWinThread *)pThread;
//	CString str;
//	m_Pause.GetWindowText(str);
//	if(str.Left(4).CompareNoCase("继续"))
//	{
//		thread->SuspendThread();
//		m_Pause.SetWindowText("继续");
//	}
//	else
//	{
//		thread->ResumeThread();
//		m_Pause.SetWindowText("暂停");
//	}
}

void CFindPage::OnFindStop() 
{
	pThread->ResumeThread();
	m_Pause.SetWindowText("暂停");
	m_BreakFlag=1;	
}

void CFindPage::OnKillfocusFindEascii() 
{
	UpdateData(0);
}

void CFindPage::Find()
{
	CString filename;
	m_File.GetWindowText(filename);
	if(filename.IsEmpty()||(pfile=fopen(filename,"rb"))==NULL)
	{
		MessageBox(filename+"\n文件打不开","打开文件失败",MB_ICONERROR);
		return;
	}
	char buf[32];
	int ret=0;
	CString str=m_AscStr;
	if(str.GetAt(str.GetLength()-1)!=10)
		str+='\n';
	CString s;
	for(int i=0;i<32;i++)
	{
		if(str.GetLength()<1)break;
		ret=str.Find(10);
		s=str.Left(ret);
		buf[i]=atoi(s);
		str.Delete(0,ret+1);
	}
	/////////
//	while(!FindWindow(NULL,"文件比较"));
//	return;
	///////////
	SetTimer(1,1000,NULL);
	rewind(pfile);
	fseek(pfile,atol(m_Sit),0);
	DWORD fl=filelength(pfile->_file)/1000;
	CString sh;sh.Format("%d",i);MessageBox(sh);
	while(DoFind(buf,i,pfile)==0)
	{
		if(feof(pfile))
		{
			KillTimer(1);
			fclose(pfile);
			MessageBox("该段未发现待搜字符串","未发现",MB_ICONEXCLAMATION);
			return;
		}
		if(m_BreakFlag)
		{
			KillTimer(1);
			fclose(pfile);
			return;
		}
	}
	m_Sit.Format("%ld",ftell(pfile));
	rewind(pfile);
	fclose(pfile);
	KillTimer(1);
	UpdateData(0);
}

BOOL CFindPage::DoFind(char *pstr, int count, _iobuf *pfile)
{
	if(count==0)
		return TRUE;
	char c;
	fread(&c,1,1,pfile);
	if(c!=*pstr)
	{
		return FALSE;
	}
	else
	{
		if(DoFind(pstr+1,count-1,pfile))
			return TRUE;
		else
		{
			fseek(pfile,-1,1);
			return FALSE;
		}
	}
}

void CFindPage::OnChangeFindSit() 
{
	UpdateData();
	CString str;
	m_File.GetWindowText(str);
	if((pfile=fopen(str,"rb"))==NULL)return;
	else
	{
		int sit=filelength(pfile->_file);
		if(sit>1000)
			m_Progress.SetPos(atol(m_Sit)/(sit/1000));
		else
			m_Progress.SetPos(atol(m_Sit)*1000/sit);
		fclose(pfile);
	}
}

BOOL CFindPage::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	
	m_Progress.SetRange(0,1000);	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CFindPage::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	int sit=filelength(pfile->_file);
	if(sit>1000)
		m_Progress.SetPos(ftell(pfile)/(sit/1000));
	else
		m_Progress.SetPos(ftell(pfile)*1000/sit);
	CPropertyPage::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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