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(); 
        } 
    } 
}