?? 文件加密dlg.cpp
字號:
// 文件加密Dlg.cpp : 實現文件
//
#include "stdafx.h"
#include "文件加密.h"
#include "文件加密Dlg.h"
#include ".\文件加密dlg.h"
#include "Dlg_Mima.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于應用程序“關于”菜單項的 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()
// CMyDlg 對話框
//extern CMyApp theApp;
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
, m_index(-1)
, m_i_replacefile(0)
, m_s_newfilename(_T(""))
, m_s_savepath(_T(""))
, m_b_deleteoldfile(FALSE)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST, m_list);
DDX_Radio(pDX, IDC_REPLACE, m_i_replacefile);
DDX_Text(pDX, IDC_NEWFILENAME, m_s_newfilename);
DDX_Text(pDX, IDC_SAVEPATH, m_s_savepath);
DDX_Control(pDX, IDC_PROGRESS, m_progress);
DDX_Check(pDX, IDC_DELETEOLDFILE, m_b_deleteoldfile);
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_CREATE()
ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
ON_BN_CLICKED(IDC_OPENFILE, OnBnClickedOpenfile)
ON_BN_CLICKED(IDC_DELETE, OnBnClickedDelete)
ON_NOTIFY(NM_CLICK, IDC_LIST, OnNMClickList)
ON_BN_CLICKED(IDC_SHOWSETTINGS, OnBnClickedShowsettings)
ON_BN_CLICKED(IDC_REPLACE, OnBnClickedReplace)
ON_BN_CLICKED(IDC_CREATNEWFILE, OnBnClickedCreatnewfile)
ON_BN_CLICKED(IDC_PAUSE, OnBnClickedPause)
ON_BN_CLICKED(IDC_BROWSE, OnBnClickedBrowse)
ON_BN_CLICKED(IDC_START, OnBnClickedStart)
ON_BN_CLICKED(IDC_DELETEOLDFILE, OnBnClickedDeleteoldfile)
ON_BN_CLICKED(IDC_SOFTSETTING, OnBnClickedSoftsetting)
ON_BN_CLICKED(IDC_SHOWABOUT, OnBnClickedShowabout)
END_MESSAGE_MAP()
// CMyDlg 消息處理程序
BOOL CMyDlg::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: 在此添加額外的初始化代碼
DWORD d;
d=::GetWindowLong(m_hWnd,GWL_STYLE);
d|=LVS_SHOWSELALWAYS;
::SetWindowLong(m_hWnd,GWL_STYLE,d);
d=m_list.GetExtendedStyle();
d|=LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT;
m_list.SetExtendedStyle(d);
m_list.SetBkColor(RGB(255,255,255));
m_list.SetTextBkColor(RGB(255,255,255));
m_list.SetTextColor(RGB(0,0,255));
m_list.InsertColumn(0,"文件",LVCFMT_LEFT,300);
m_list.InsertColumn(1,"大小(KB)",LVCFMT_LEFT,80);
m_list.InsertColumn(2,"狀態",LVCFMT_LEFT,80);
GetDlgItem(IDC_DELETE)->EnableWindow(false);
GetDlgItem(IDC_START)->EnableWindow(false);
UpdateData(false);
OnBnClickedReplace();
OnBnClickedShowsettings();
m_progress.SetRange(0,100);
return TRUE; // 除非設置了控件的焦點,否則返回 TRUE
}
void CMyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向對話框添加最小化按鈕,則需要下面的代碼
// 來繪制該圖標。對于使用文檔/視圖模型的 MFC 應用程序,
// 這將由框架自動完成。
void CMyDlg::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 CMyDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
int CMyDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
//m_wndToolBar.Create(this);
//m_wndToolBar.LoadToolBar(IDR_TOOLBAR);
//m_wndToolBar.MoveWindow(0,0,200,32);
//m_wndToolBar.ShowWindow(1);
return 0;
}
void CMyDlg::OnBnClickedCancel()
{
// TODO: 在此添加控件通知處理程序代碼
OnCancel();
}
void CMyDlg::OnBnClickedOpenfile()
{
CFileDialog dlg( TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, NULL, NULL );
DWORD MAXFILE = 4000;
dlg.m_ofn.nMaxFile = MAXFILE;
char* pc = new char[MAXFILE];
dlg.m_ofn.lpstrFile = pc;
dlg.m_ofn.lpstrFile[0] = NULL;
int iindex,icount;
int iReturn = dlg.DoModal();
CString str;
// char *path;
int len;
FILE *pf;
bool exist=false;
char whetherencrypt[50];//加密的標志:文件以 //--加密了(章征貴)--// 開始
unsigned long size;
if(iReturn == IDOK)
{
iindex=icount=m_list.GetItemCount();
POSITION pos = dlg.GetStartPosition();
while (pos != NULL)
{
str=dlg.GetNextPathName(pos);
exist=false;
for(int i=0;i<icount;i++)
if(strcmp(str,m_list.GetItemText(i,0))==0)
{
exist=true;
break;
}
if(exist)
{
AfxMessageBox("文件 “"+str+"“ 已經存在于列表中!");
continue;
}
// path=new char[len+1];
//for(i=0;i<len;i++)path[i]=str[i];
// path[i]='\0';
pf=fopen(str,"rb");
if(pf==NULL)continue;
m_list.InsertItem(iindex,str);
len=str.GetLength();
fseek(pf,0,SEEK_END);
size=ftell(pf)/1024;//得到文件的大小
str.Format("%d",size);
m_list.SetItemText(iindex,1,str);
fseek(pf,0,SEEK_SET);
fread(whetherencrypt,22,1,pf);
whetherencrypt[22]='\0';
if(strcmp(whetherencrypt,"//--加密了(章征貴)--//")==0)str="已加密";
else str="未加密";
m_list.SetItemText(iindex,2,str);
iindex++;
// if(path)delete path;
fclose(pf);
}
}
if(CommDlgExtendedError() == 0x3003)
AfxMessageBox("一次打開的文件過多!");
delete []pc;
}
void CMyDlg::OnBnClickedDelete()
{
if(m_index<0)return;
m_list.DeleteItem(m_index);
GetDlgItem(IDC_DELETE)->EnableWindow(false);
GetDlgItem(IDC_START)->EnableWindow(false);
}
void CMyDlg::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
CString str;
POSITION pos=m_list.GetFirstSelectedItemPosition();
m_index=m_list.GetNextSelectedItem(pos);
if(m_index<0)
{
GetDlgItem(IDC_DELETE)->EnableWindow(false);
GetDlgItem(IDC_START)->EnableWindow(false);
m_s_newfilename="";
UpdateData(false);
return;
}
str=m_list.GetItemText(m_index,0);
int len=str.GetLength();
int i=len;
while(str[i]!='\\')i--;
m_s_newfilename=str.Right(len-i-1);
m_s_savepath=str.Left(i+1);
GetDlgItem(IDC_DELETE)->EnableWindow(true);
GetDlgItem(IDC_START)->EnableWindow(true);
str=m_list.GetItemText(m_index,2);
if(strcmp(str,"已加密")==0)
{
GetDlgItem(IDC_START)->SetWindowText("開始解密");
m_s_newfilename="(已解密)"+m_s_newfilename;
}
else
{
GetDlgItem(IDC_START)->SetWindowText("開始加密");
m_s_newfilename="(已加密)"+m_s_newfilename;
}
UpdateData(false);
}
void CMyDlg::OnBnClickedShowsettings()
{
CString str;
CRect rect;
GetWindowRect(rect);
GetDlgItem(IDC_SHOWSETTINGS)->GetWindowText(str);
if(strcmp(str,"設置<<<")==0)
{
GetDlgItem(IDC_SHOWSETTINGS)->SetWindowText("設置>>>");
MoveWindow(rect.left,rect.top,rect.Width(),rect.Height()-115);
}
else
{
GetDlgItem(IDC_SHOWSETTINGS)->SetWindowText("設置<<<");
MoveWindow(rect.left,rect.top,rect.Width(),rect.Height()+115);
}
}
void CMyDlg::OnBnClickedReplace()
{
UpdateData(true);
GetDlgItem(IDC_NEWFILENAME)->EnableWindow(false);
GetDlgItem(IDC_SAVEPATH)->EnableWindow(false);
GetDlgItem(IDC_BROWSE)->EnableWindow(false);
GetDlgItem(IDC_DELETEOLDFILE)->EnableWindow(false);
}
void CMyDlg::OnBnClickedCreatnewfile()
{
UpdateData(true);
GetDlgItem(IDC_NEWFILENAME)->EnableWindow(true);
GetDlgItem(IDC_SAVEPATH)->EnableWindow(true);
GetDlgItem(IDC_BROWSE)->EnableWindow(true);
GetDlgItem(IDC_DELETEOLDFILE)->EnableWindow(true);
}
void CMyDlg::OnBnClickedPause()
{
}
void CMyDlg::OnBnClickedBrowse()
{
char szDir[MAX_PATH];
BROWSEINFO bi;
ITEMIDLIST *pidl;
UpdateData();
CString strDlgTitle = "請選擇新文件存放的位置:";
bi.hwndOwner = this->m_hWnd;
//SHParseDisplayName(theApp.path,NULL,bi.pidlRoot,0,0);
bi.pidlRoot = NULL;
bi.pszDisplayName = szDir;
bi.lpszTitle = strDlgTitle;
bi.ulFlags = BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
bi.iImage = 0;
pidl = SHBrowseForFolder(&bi);
if(pidl == NULL)
return;
if(SHGetPathFromIDList(pidl, szDir))
this->m_s_savepath=szDir;
LPMALLOC lpMalloc;
if( SUCCEEDED(SHGetMalloc(&lpMalloc)) )
{
lpMalloc->Free( pidl );
lpMalloc->Release();
}
/*CFileDialog dlg(FALSE,NULL,m_s_newfilename);
dlg.m_ofn.Flags|=OFN_EXPLORER;
if(dlg.DoModal()==IDOK)
{
//m_s_savepath=dlg.GetFolderPath();
m_s_newfilename=dlg.GetFileName();
}*/
UpdateData(FALSE);
}
void CMyDlg::OnBnClickedStart()
{
CString newfilepath,oldfilepath;
bool flag=false;//是否替代源文件
bool fl,newsametoold=false;
int index=m_index;
unsigned long filesize,buffersize=1024*1024*2;//2M
char *buffer;
CRect rect;
m_progress.GetWindowRect(rect);
try
{
buffer=new char[buffersize];//2M
}
catch(...)
{
AfxMessageBox("無法完成操作!\n沒有足夠的內存!");
return;
}
UpdateData(true);
unsigned long step,i,residue,j;
oldfilepath=m_list.GetItemText(index,0);
if(m_i_replacefile==0)
{
i=oldfilepath.GetLength()-1;
while(oldfilepath.GetAt(i)!='\\'&&i>=0)i--;
newfilepath=oldfilepath.Left(i+1)+"正在加密"+oldfilepath.Right(oldfilepath.GetLength()-i-1);
flag=true;
}
else
{
int i=m_s_savepath.GetLength();
if(m_s_savepath[i-1]=='\\')
newfilepath=m_s_savepath+m_s_newfilename;
else newfilepath=m_s_savepath+"\\"+m_s_newfilename;
}
if(strcmp(newfilepath,oldfilepath)==0)
{
newsametoold=true;
i=oldfilepath.GetLength()-1;
while(oldfilepath.GetAt(i)!='\\'&&i>=0)i--;
newfilepath=oldfilepath.Left(i+1)+"正在加密"+oldfilepath.Right(oldfilepath.GetLength()-i-1);
}
FILE *fpnew,*fpold;
fpnew=fopen(newfilepath,"wb");
fpold=fopen(oldfilepath,"rb");
if(fpold==NULL)
{
AfxMessageBox("無法完成操作!\n請檢查源文件是否存在!");
fclose(fpnew);
::DeleteFile(newfilepath);
delete []buffer;
return;
}
if(fpnew==NULL)
{
AfxMessageBox("無法完成操作!\n請檢查新文件路徑是否可用!");
fclose(fpold);
delete []buffer;
return;
}
GetDlgItem(IDC_DELETE)->EnableWindow(false);
GetDlgItem(IDC_START)->EnableWindow(false);
fseek(fpold,0,SEEK_END);
filesize=ftell(fpold);//得到文件的大小
if(strcmp("已加密",m_list.GetItemText(index,2))==0)
{
fseek(fpold,22,SEEK_SET);
filesize-=22;
fl=true;
}
else
{
fseek(fpold,0,SEEK_SET);
fwrite("//--加密了(章征貴)--//",22,1,fpnew);
fl=false;
}
step=filesize/(buffersize);
residue=filesize%(buffersize);//余數
for(i=0;i<step;i++)
{
if(fread(buffer,sizeof(char)*buffersize,1,fpold)==0)//每次讀2M
{//如果讀取失敗
AfxMessageBox("無法完成操作!\n請檢查源文件路徑是否正在使用!\n或文件屬性是只讀的");
fclose(fpold);
fclose(fpnew);
delete []buffer;
return;
}
for(j=0;j<buffersize;j++)
buffer[j]=~buffer[j];//加密
fwrite(buffer,sizeof(char)*buffersize,1,fpnew);
m_progress.SetPos(100.0/(step+1)*i);
InvalidateRect(rect);
//Invalidate();
}
if(residue>0)
if(fread(buffer,sizeof(char)*residue,1,fpold)==0)//讀剩余的部分
{//如果讀取失敗
AfxMessageBox("無法完成操作!\n請檢查源文件路徑是否正在使用!\n或文件屬性是只讀的");
fclose(fpold);
fclose(fpnew);
delete []buffer;
return;
}
for(j=0;j<residue;j++)
buffer[j]=~buffer[j];//加密
fwrite(buffer,sizeof(char)*residue,1,fpnew);
fclose(fpnew);
fclose(fpold);
if(flag||newsametoold)
{
::DeleteFile(oldfilepath);
::MoveFile(newfilepath,oldfilepath);
::DeleteFile(newfilepath);
newfilepath=oldfilepath;
oldfilepath="";
}
if(!flag&&(m_b_deleteoldfile))//刪除舊文件
{
::DeleteFile(oldfilepath);
m_list.DeleteItem(index);
}
delete []buffer;
m_progress.SetPos(100);
AfxMessageBox("完成操作!");
m_progress.SetPos(0);
if(m_i_replacefile==0)//更新列表的顯示
{
//m_list.SetItemText(index,0,newfilepath);
if(fl)m_list.SetItemText(index,2,"未加密");
else m_list.SetItemText(index,2,"已加密");
}
}
void CMyDlg::OnBnClickedDeleteoldfile()
{
UpdateData(true);
}
void CMyDlg::OnBnClickedSoftsetting()
{
CDlg_Mima dl;
dl.DoModal();
}
void CMyDlg::OnBnClickedShowabout()
{
CAboutDlg dl;
dl.DoModal();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -