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

📄 encryptfiledlg.cpp

📁 对文件进行加密的小源代码,其中有在一进程中启动另一进程等
💻 CPP
字号:
// EncryptFileDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "EncryptFile.h"
#include "EncryptFileDlg.h"
#include ".\encryptfiledlg.h"

#include "..\EncryptArithmetic\Encrypt.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


CEncrypt m_encrypt;
char key[16]={0};
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CEncryptFileDlg 对话框



CEncryptFileDlg::CEncryptFileDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CEncryptFileDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CEncryptFileDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_COMBO1, m_pDriver);
	DDX_Control(pDX, IDC_LIST1, m_viewList);
	DDX_Control(pDX, ID_ENCRYPT_BTN, m_EncryBtn);
	DDX_Control(pDX, IDC_BUTTON1, m_updateBtn);
	DDX_Control(pDX, IDCANCEL, m_quitBtn);
}

BEGIN_MESSAGE_MAP(CEncryptFileDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
	ON_BN_CLICKED(ID_ENCRYPT_BTN, OnBnClickedEncryptBtn)
	ON_WM_LBUTTONDBLCLK()
	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
	ON_WM_CLOSE()
END_MESSAGE_MAP()


// CEncryptFileDlg 消息处理程序

BOOL CEncryptFileDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 将\“关于...\”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	
	//初始化下拉菜单
	char lpBuffer[MAX_PATH];//存储文件路径

	char* ptr;

	CString str;
	CTime time;
	int index=0;

	//得到电脑中的所有驱动
	::GetLogicalDriveStrings(MAX_PATH,lpBuffer);
	ptr=lpBuffer;
	//在下拉框中显示所有
	while(*ptr)
	{
		str=ptr;
		m_pDriver.InsertString(index,str);
		ptr+=strlen(ptr)+1;
		index++;
	}

	m_pDriver.SetCurSel(1);
	//初始化ListCtrl
	m_viewList.InsertColumn(0,"文件名字",LVCFMT_CENTER,200);
	m_viewList.InsertColumn(1,"修改时间",LVCFMT_CENTER,200);
	m_viewList.InsertColumn(2,"属性",LVCFMT_CENTER,100);
	//m_viewList.InsertColumn(3,"是否加密",LVCFMT_CENTER,100);

	//设置当前路径
	::SetCurrentDirectory("C:\\");
	//得到当前路径
	::GetCurrentDirectory(MAX_PATH,(LPTSTR)(LPCTSTR)m_CurDir);

	index=0;

	//设置LISTCTRL的属性
	m_viewList.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
	m_viewList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
    
	//文件查找
	CFileFind fileFind;

	//判断文件目录是否找完
	BOOL bContinue;
    
	//查找文件
	bContinue=fileFind.FindFile("*.*");
	while(bContinue)
	{
		//查找下一文件
		bContinue=fileFind.FindNextFile();

		//如果文件是隐藏的就跳过
		if(fileFind.IsHidden())continue;

		//得到文件的名字,并插入LISTTRL
		str=fileFind.GetFileName();
		m_viewList.InsertItem(index,str);
		
		//得到文件的最后修改时间并插入
		fileFind.GetLastWriteTime(time);
		str=time.Format("%Y年%m月%d日  %H:%M:%S");
		m_viewList.SetItemText(index,1,str);

		if(fileFind.IsDirectory())//是目录则插入目录
		{
			m_viewList.SetItemText(index,2,"目录");
			
		}
		else//不是则插入文件的大小
		{
			int i=fileFind.GetLength();
			if(i>1024)
			{
				str.Format("%d",i/1024);
				str+="KB";
			}
			else
				str.Format("%d",i);
			m_viewList.SetItemText(index,2,str);
		}
		index++;
	}

	//得到随机加密钥匙
	m_encrypt.Rand_key(key);
	//传到CmyListCtrl类中进行文件解密
	m_viewList.SetKey(key);
    m_viewList.SetButton(&m_EncryBtn);
	m_Handle=NULL;
	return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

void CEncryptFileDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CEncryptFileDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CEncryptFileDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}


void CEncryptFileDlg::OnBnClickedCancel()
{
	// TODO: 在此添加控件通知处理程序代码
	OnCancel();
}

//加密按钮
void CEncryptFileDlg::OnBnClickedEncryptBtn()
{
	// TODO: 在此添加控件通知处理程序代码
	if(m_Handle==NULL)//如果线程没有创建则创建并使加密按钮变灰
	{
	    m_Handle=::CreateThread(NULL,0,_EncryptThread,this,0,NULL);
		m_EncryBtn.EnableWindow(0);
	}
	else//已经存在则先挂起加密线程对所有已经加密的文件进行解密,再激活线程,并使按钮变灰
	{
		::SuspendThread(m_Handle);
		for(int i=0;i<m_stringArray.GetCount();i++)
		{
            m_encrypt.Des_GoFile(m_stringArray.GetAt(i),key,1);
		}
        m_stringArray.RemoveAll();
		::ResumeThread(m_Handle);

		m_EncryBtn.EnableWindow(0);
	}
	//dlg.DoModal();
}

void CEncryptFileDlg::Update(CString str)
{

}

void CEncryptFileDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CString str,str1;

	int index=m_viewList.GetNextItem(-1,LVNI_SELECTED);
	if (index==-1)
		return;
	
	str=m_viewList.GetItemText(index,0);
	str1=m_viewList.GetItemText(index,2);
	
	if(str1=="目录"||str==".."||str==".")
	{
		m_CurDir=m_CurDir+str;
		::SetCurrentDirectory(str);
	}
	else
	{
		
		::ShellExecute(this->m_hWnd,NULL,str,"open",m_CurDir,SW_SHOWDEFAULT);
		//return;
	}
	Update(m_CurDir);

	CDialog::OnLButtonDblClk(nFlags, point);
}
//更改驱动器
void CEncryptFileDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	int index=0;
	CString str;
    index=m_pDriver.GetCurSel();

	//得到选择的驱动器
    m_pDriver.GetLBText(index,str);

	//设置当前目录
    ::SetCurrentDirectory(str);
	::GetCurrentDirectory(MAX_PATH,(LPTSTR)(LPCTSTR)m_CurDir);

	index=0;

	//出事化LIST框
    m_viewList.DeleteAllItems();
	m_viewList.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);
	m_viewList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

	//注释参上
	CFileFind fileFind;
	CTime time;
	BOOL bContinue;
	bContinue=fileFind.FindFile("*.*");
	while(bContinue)
	{
		bContinue=fileFind.FindNextFile();
		if(fileFind.IsHidden())continue;
		str=fileFind.GetFileName();
		m_viewList.InsertItem(index,str);
		
		fileFind.GetLastWriteTime(time);
		str=time.Format("%Y年%m月%d日  %H:%M:%S");
		m_viewList.SetItemText(index,1,str);

		if(fileFind.IsDirectory())
		{
			m_viewList.SetItemText(index,2,"目录");
			
		}
		else
		{
			int i=fileFind.GetLength();
			if(i>1024)
			{
				str.Format("%d",i/1024);
				str+="KB";
			}
			else
				str.Format("%d",i);
			m_viewList.SetItemText(index,2,str);
		}
		index++;
	}
}
//加密线程
DWORD WINAPI CEncryptFileDlg::_EncryptThread(LPVOID lpParameter)
{
	//得到本THIS指针
	CEncryptFileDlg*pThis= (CEncryptFileDlg*)lpParameter;
	CFileFind fileFind;
	CString str;

	int len=0;
	int i=0;
	BOOL bContinue;

	while(1)
	{
		i=0;
		len=0;
		bContinue=fileFind.FindFile("*.*");
		while(bContinue)
		{
			bContinue=fileFind.FindNextFile();

			//如果是隐藏文件则跳过
			if(fileFind.IsHidden())continue;

            //判断是不是目录
			if(!(fileFind.IsDirectory()))
			{
				str=fileFind.GetFilePath();         
				len=pThis->m_stringArray.GetCount();
				//查找要加密的文件是否在加密文件列表中
				for(i=0;i<len;i++)
				{
					if(pThis->m_stringArray.GetAt(i).Compare(str)==0)
						break;
				}
				if(i==len)//表示查到的文件不在文件加密文件列表中所以把此文件添加到加密文件列表中
				{
					pThis->m_stringArray.Add(str);
					m_encrypt.Des_GoFile(str,key,0);
				}
			}
		}
        Sleep(3000);
	}
	//pThis->dlg.EndDialog(1000);
	//Sleep(2000);
	return 0;
}
void CEncryptFileDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值


    //由于本程序为测试程序所以在程序退出后对所有的文件进行解密
    for(int i=0;i<m_stringArray.GetCount();i++)
	{
        m_encrypt.Des_GoFile(m_stringArray.GetAt(i),key,1);
	}
	CDialog::OnClose();
}

⌨️ 快捷键说明

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