www.pudn.com > FileSecurity.rar > MainForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.IO;
using System.Runtime.InteropServices;
using XPTable;
using XPTable.Models;
using System.Diagnostics;
using System.Resources;
namespace FileSecurity
{
public partial class MainForm : Form
{
// 工作目录
private string strWorkingDirectory = null;
private Image imgSucceed;
private Image imgFailed;
private enum OperMode
{
ENCRYPT = 0,
DECRYPT = 1
};
private struct FileArgs
{
public string Src;
public string Dst;
public string Pwd;
public OperMode Mode;
public int Idx;
};
private ArrayList fileArgsList;
private bool bWorking = false;
public MainForm()
{
InitializeComponent();
// 设置树控件为系统图像列表
SystemImageList.SetTVImageList(treeExplorer.Handle);
// 载入系统根节点
LoadRootNodes();
}
///
/// 载入系统根节点
///
private void LoadRootNodes()
{
// 创建根Shell对象
ShellItem m_shDesktop = new ShellItem();
// 创建根节点
TreeNode tvwRoot = new TreeNode();
tvwRoot.Text = m_shDesktop.DisplayName;
tvwRoot.ImageIndex = m_shDesktop.IconIndex;
tvwRoot.SelectedImageIndex = m_shDesktop.IconIndex;
tvwRoot.Tag = m_shDesktop;
// 添加子项
ArrayList arrChildren = m_shDesktop.GetSubFolders();
foreach (ShellItem shChild in arrChildren)
{
TreeNode tvwChild = new TreeNode();
tvwChild.Text = shChild.DisplayName;
tvwChild.ImageIndex = shChild.IconIndex;
tvwChild.SelectedImageIndex = shChild.IconIndex;
tvwChild.Tag = shChild;
// 如果是一个有子目录的目录,添加可展开标志
if (shChild.IsFolder && shChild.HasSubFolder)
tvwChild.Nodes.Add("PH");
tvwRoot.Nodes.Add(tvwChild);
}
// 将根节点加入树
treeExplorer.Nodes.Clear();
treeExplorer.Nodes.Add(tvwRoot);
tvwRoot.Expand();
}
private void treeExplorer_BeforeSelect(object sender, TreeViewCancelEventArgs e)
{
ShellItem shItem = (ShellItem)e.Node.Tag;
e.Node.Expand();
strWorkingDirectory = shItem.GetPath();
RefreshFileList();
}
void RefreshFileList()
{
listFiles.Items.Clear();
if (strWorkingDirectory == null || strWorkingDirectory.Length == 0)
return;
this.Cursor = Cursors.WaitCursor;
try
{
string[] files = Directory.GetFiles(strWorkingDirectory);
int imageIndex = 0;
imageListFiles.Images.Clear();
ShellAPI.SHFILEINFO shinfo = new ShellAPI.SHFILEINFO();
listFiles.BeginUpdate();
foreach (string s in files)
{
FileInfo fi = new FileInfo(s);
// 获得文件图标
IntPtr hImgSmall = ShellAPI.SHGetFileInfo(s, 0, out shinfo, (uint)Marshal.SizeOf(shinfo),
ShellAPI.SHGFI.SHGFI_ICON | ShellAPI.SHGFI.SHGFI_SMALLICON);
ListViewItem lvi = new ListViewItem(fi.Name);
long fileLength = fi.Length / 1024;
if (shinfo.hIcon != IntPtr.Zero)
{
System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
imageListFiles.Images.Add(myIcon);
lvi.ImageIndex = imageIndex++;
}
else
{
lvi.ImageIndex = -1;
}
lvi.Tag = fi.FullName;
lvi.SubItems.Add(fileLength.ToString() + "KB");
lvi.SubItems.Add(fi.LastWriteTime.ToLongDateString());
listFiles.Items.Add(lvi);
}
listFiles.EndUpdate();
}
catch (IOException ex)
{
MessageBox.Show("RefreshFileList IOexception: " + ex.Message);
}
finally
{
this.Cursor = Cursors.Arrow;
}
}
private void MainForm_Load(object sender, EventArgs e)
{
System.Reflection.Assembly myAssembly;
myAssembly = this.GetType().Assembly;
ResourceManager myManager = new ResourceManager("FileSecurity.Images", myAssembly);
imgSucceed = (Image)myManager.GetObject("Succeed");
imgFailed = (Image)myManager.GetObject("Failed");
this.tableWork.BeginUpdate();
TextColumn pathColumn = new TextColumn("路径", 500);
ProgressBarColumn progressColumn = new ProgressBarColumn("操作进度", 100);
TextColumn passwordColumn = new TextColumn("密码", 100);
ImageColumn resultColumn = new ImageColumn("操作结果", 70);
resultColumn.DrawText = true;
this.tableWork.ColumnModel = new ColumnModel(new Column[] {
pathColumn, progressColumn, passwordColumn, resultColumn});
this.tableWork.ColumnModel.Columns[0].Editable = false;
this.tableWork.TableModel = new TableModel();
this.tableWork.TableModel.RowHeight = 21;
this.tableWork.EndUpdate();
fileArgsList = new ArrayList();
}
private void listFiles_DoubleClick(object sender, EventArgs e)
{
if (bWorking)
return;
ListViewItem item = listFiles.SelectedItems[0];
this.tableWork.TableModel.Rows.Add(new Row(
new Cell[] {
new Cell(item.Tag.ToString()),
new Cell(0),
new Cell(""),
new Cell()
}));
}
private void splitContainerH_MouseUp(object sender, MouseEventArgs e)
{
mainMenuStrip.Focus();
}
private void splitContainerV_MouseUp(object sender, MouseEventArgs e)
{
mainMenuStrip.Focus();
}
private void btnFolderTree_Click(object sender, EventArgs e)
{
if (btnFolderTree.Checked)
{
splitContainerV.Panel1Collapsed = true;
}
else
{
splitContainerV.Panel1Collapsed = false;
}
mnuFolderTree.Checked = btnFolderTree.Checked = !btnFolderTree.Checked;
}
private void mnuFolderTree_Click(object sender, EventArgs e)
{
if (mnuFolderTree.Checked)
{
splitContainerV.Panel1Collapsed = true;
}
else
{
splitContainerV.Panel1Collapsed = false;
}
btnFolderTree.Checked = mnuFolderTree.Checked = !mnuFolderTree.Checked;
}
// 退出
private void mnuExit_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void mnuHelp_Click(object sender, EventArgs e)
{
OpenHelpDoc();
}
private void OpenHelpDoc()
{
Process helpProcess = new Process();
try
{
helpProcess.StartInfo.FileName = "Help.txt";
helpProcess.StartInfo.Verb = "Print";
helpProcess.StartInfo.CreateNoWindow = true;
helpProcess.Start();
}
catch (Win32Exception)
{
MessageBox.Show("无法打开帮助", "错误", MessageBoxButtons.OK);
}
}
private void mnuAbout_Click(object sender, EventArgs e)
{
About about = new About();
about.ShowDialog();
}
// 加密
private void btnEncrypt_Click(object sender, EventArgs e)
{
if (bWorking)
return;
if (tableWork.TableModel.Rows.Count == 0)
return;
Cell pathCell, passwordCell;
string src, dst, pwd;
// 密码检查
foreach (Row workRow in tableWork.TableModel.Rows)
{
passwordCell = workRow.Cells[2];
if (passwordCell.Text.Length==0)
{
MessageBox.Show("密码不能为空");
return;
}
}
fileArgsList.Clear();
int Idx = 0;
foreach (Row workRow in tableWork.TableModel.Rows)
{
pathCell = workRow.Cells[0];
passwordCell = workRow.Cells[2];
FileArgs args = new FileArgs();
args.Src = pathCell.Text;
args.Dst = args.Src + ".enc";
args.Pwd = passwordCell.Text;
args.Mode = OperMode.ENCRYPT;
args.Idx = Idx;
fileArgsList.Add(args);
Idx++;
}
bWorking = true;
threadWorker.RunWorkerAsync(fileArgsList);
timerWatch.Start();
}
// 解密
private void btnDecrypt_Click(object sender, EventArgs e)
{
if (bWorking)
return;
if (tableWork.TableModel.Rows.Count == 0)
return;
Cell pathCell, passwordCell;
string src, dst, pwd;
// 密码检查
foreach (Row workRow in tableWork.TableModel.Rows)
{
passwordCell = workRow.Cells[2];
if (passwordCell.Text.Length == 0)
{
MessageBox.Show("密码不能为空");
return;
}
}
fileArgsList.Clear();
int Idx = 0;
foreach (Row workRow in tableWork.TableModel.Rows)
{
pathCell = workRow.Cells[0];
passwordCell = workRow.Cells[2];
FileArgs args = new FileArgs();
args.Src = pathCell.Text;
args.Dst = Path.GetDirectoryName(args.Src)+"\\"+Path.GetFileNameWithoutExtension(args.Src);
args.Pwd = passwordCell.Text;
args.Mode = OperMode.DECRYPT;
args.Idx = Idx;
fileArgsList.Add(args);
Idx++;
}
bWorking = true;
threadWorker.RunWorkerAsync(fileArgsList);
timerWatch.Start();
}
private void threadWorker_DoWork(object sender, DoWorkEventArgs e)
{
ArrayList argList = (ArrayList)e.Argument;
FileArgs args = (FileArgs)argList[0];
MessageBox.Show(args.Src.ToString() + "\n" + args.Dst.ToString());
GCHandle src_h = GCHandle.Alloc(args.Src, GCHandleType.Pinned);
GCHandle dst_h = GCHandle.Alloc(args.Dst, GCHandleType.Pinned);
GCHandle pwd_h = GCHandle.Alloc(args.Pwd, GCHandleType.Pinned);
if (args.Mode == OperMode.ENCRYPT)
{
e.Result = xEncrypt.FileEncrypt(
src_h.AddrOfPinnedObject(),
dst_h.AddrOfPinnedObject(),
pwd_h.AddrOfPinnedObject());
}
else
{
e.Result = xEncrypt.FileDecrypt(
src_h.AddrOfPinnedObject(),
dst_h.AddrOfPinnedObject(),
pwd_h.AddrOfPinnedObject());
}
src_h.Free();
dst_h.Free();
pwd_h.Free();
}
private void threadWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
FileArgs args = (FileArgs)fileArgsList[0];
tableWork.TableModel.Rows[args.Idx].Cells[1].Data = 100;
if((int)e.Result!=0)
{
tableWork.TableModel.Rows[args.Idx].Cells[3].Text = "成功";
tableWork.TableModel.Rows[args.Idx].Cells[3].Image = imgSucceed;
}
else
{
tableWork.TableModel.Rows[args.Idx].Cells[3].Text = "失败";
tableWork.TableModel.Rows[args.Idx].Cells[3].Image = imgFailed;
}
fileArgsList.RemoveAt(0);
// 没有操作完
if (fileArgsList.Count != 0)
{
threadWorker.RunWorkerAsync(fileArgsList);
}
else
{
// 全部操作完毕
timerWatch.Stop();
}
bWorking = false;
}
// 文件监视
private void timerWatch_Tick(object sender, EventArgs e)
{
FileArgs args = (FileArgs)fileArgsList[0];
FileInfo dstInfo = new FileInfo(args.Dst);
if (!dstInfo.Exists) return;
FileInfo srcInfo = new FileInfo(args.Src);
tableWork.TableModel.Rows[args.Idx].Cells[1].Data = (int)(100 * (((double)dstInfo.Length) / ((double)srcInfo.Length)));
Debug.Print(tableWork.TableModel.Rows[args.Idx].Cells[1].Data.ToString());
}
private void btnClearTable_Click(object sender, EventArgs e)
{
if (bWorking)
return;
tableWork.TableModel.Rows.Clear();
}
private void btnHelp_Click(object sender, EventArgs e)
{
OpenHelpDoc();
}
private void btnOpen_Click(object sender, EventArgs e)
{
if (bWorking)
return;
OpenFileDialog fileDlg = new OpenFileDialog();
fileDlg.Filter = "所有文件(*.*)|*.*";
DialogResult result = fileDlg.ShowDialog(this);
if (result == DialogResult.OK)
{
this.tableWork.TableModel.Rows.Add(new Row(
new Cell[] {
new Cell(fileDlg.FileName),
new Cell(0),
new Cell(""),
new Cell()
}));
}
}
private void btnReflush_Click(object sender, EventArgs e)
{
RefreshFileList();
}
private void btnClearTable_Click_1(object sender, EventArgs e)
{
if (bWorking)
return;
this.tableWork.TableModel.Rows.Clear();
}
}
}