用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c#代码库

将选择的文件和目录打包成ISO文件

2016-08-20 作者: 小章举报

[c#]代码库

//isobuilderform.cs

using AboutUtil;
using FileImage;
using IMAPI2.Interop;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ISOBuilder
{
    public partial class ISOBuilderForm : Form
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetForegroundWindow(IntPtr hWnd);
        Stopwatch _tm = new Stopwatch();
        ImageRepository _repository;
        public ISOBuilderForm()
        {
            _repository = new ImageRepository();
            InitializeComponent();
        }

        void AsyncFormattingEvent(object o1, object o2)
        {
            Invoke(new DiscFormat2Data_EventsHandler(FormattingEvent), new Object[] { o1, o2 });
        }

        void FormattingEvent(object o1, object o2)
        {
            IMAPI2.Interop.IProgressItem it = o1 as IMAPI2.Interop.IProgressItem;
            int i = (int)(Convert.ToSingle(o2) * 100);
            this._progBar.Value = 100 + i;
            if (it != null)
                this._lblUpdate.Text = string.Format("Formatting {0}", it.Description);
            if (!_ckWorker.Checked)
                Application.DoEvents();
        }
        void AsyncRepositoryUpdate(object o1, object o2)
        {
            Invoke(new DiscFormat2Data_EventsHandler(RepositoryUpdate), new Object[] { o1, o2 });
        }
        void RepositoryUpdate(object o1, object o2)
        {
            string file = o1 as string;
            long i = Convert.ToInt64(o2);
            int pos = (int)((double)_repository.ActualSize / _repository.SizeBeforeFormatting * 100);
            _progBar.Value = pos;
            _lblUpdate.Text = string.Format("Adding {0} size = {1}", file, i);
            if (!_ckWorker.Checked)
                Application.DoEvents();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                _bindingSource.DataSource = _repository.Items;
                _dataGridView.DataSource = _bindingSource;
                //strip the first and last from IMAPI_MEDIA_PHYSICAL_TYPE enum values
                IMAPI_MEDIA_PHYSICAL_TYPE[] mediatypes = (IMAPI_MEDIA_PHYSICAL_TYPE[])Enum.GetValues(typeof(IMAPI_MEDIA_PHYSICAL_TYPE));
                List<IMAPI_MEDIA_PHYSICAL_TYPE> lst = new List<IMAPI_MEDIA_PHYSICAL_TYPE>(mediatypes.Length);
                lst.AddRange(mediatypes);
                lst.RemoveAt(mediatypes.Length - 1);
                lst.RemoveAt(0);
                _cbxMediaType.DataSource = lst;
                //lst.Clear();
                _cbxMediaType.SelectedItem = IMAPI_MEDIA_PHYSICAL_TYPE.IMAPI_MEDIA_TYPE_DISK;
                About.InitSysMenu(this);
            }
            catch (COMException ex)
            {
                if ((uint)ex.ErrorCode == 0x80040154)
                {
                    if (MessageBox.Show(this, "IMAPI2 is not installed on this machine.\nDo you want to install it?",
        "Error", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
                        System.Diagnostics.Process.Start("Iexplore.exe", @"http://support.microsoft.com/kb/KB932716");
                    else
                        this.Close();
                }

            }
            catch (Exception)
            {

                throw;
            }

        }
        event ImageRepository.CancelingHandler Stop;
        delegate void ProgressBarHandler(int max);
        // This event handler is where the actual,
        // potentially time-consuming work is done.
        private void backgroundWorker_DoWork(object sender,
            DoWorkEventArgs e)
        {
            ISOFormatter frm = null;
            try
            {
                e.Result = null;

                IFileSystemImage ifsi = _repository as IFileSystemImage;

                IFileSystemImageResult res = ifsi.CreateResultImage();
                if (res == null)
                    return;
                frm = new ISOFormatter(e.Argument as string);

                this.Stop += frm.CancelOp;

                if (_repository.Update != null)
                {
                    DiscFormat2Data_Events ev = frm as DiscFormat2Data_Events;
                    ev.Update += AsyncFormattingEvent;
                }
                frm.CreateFullImage(res);

                e.Result = frm;
            }
            catch (COMException ex)
            {
                if (ex.ErrorCode == -1062555360)
                {
                    throw new ApplicationException("Media size could be too small for the amount of data", ex);
                }
                else
                    throw;
            }
            catch (Exception)
            {

                e.Result = null;
            }
            finally
            {
                e.Cancel = _backgroundWorker.CancellationPending;
            }

        }

        private void _btnBuildFile_Click(object sender, EventArgs e)
        {
            if (_btnBuildFile.Text == "Cancel")
            {
                if (_ckWorker.Checked && _backgroundWorker.IsBusy)
                    _backgroundWorker.CancelAsync();
                this.Stop();

                _btnBuildFile.Enabled = false;
                Application.DoEvents();
                return;
            }

            _tm.Reset();
            _tm.Start();
            _progBar.Value = 0;

            IFileSystemImageResult imageResult = null;
            ISOFormatter formatter = null;
            try
            {

                if (_repository.Items.Count == 0)
                {
                    MessageBox.Show(this, "No items to archive");
                    return;
                }
                if (string.IsNullOrEmpty(_lblDest.Text))
                {
                    MessageBox.Show(this, "No destination was selected", "Warning");
                    if (_saveFileDialog.ShowDialog(this) == DialogResult.OK)
                    {
                        _lblDest.Text = _saveFileDialog.FileName;
                    }
                    else
                        return;
                }

                IFileSystemImage ifsi = InitRepository();
                if (_ckWorker.Checked)
                {
                    _btnBuildFile.Enabled = true;
                    _backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
                    _backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompletedEvent);
                    _backgroundWorker.RunWorkerAsync(_lblDest.Text);
                }
                else
                {
                    _btnBuildFile.Enabled = true;
                    Application.DoEvents();
                    imageResult = ifsi.CreateResultImage();
                    if (imageResult == null)
                    {
                        if (_repository.Cancel)
                            _lblUpdate.Text = "Canceled on UI Thread";
                        return;
                    }

                    formatter = new ISOFormatter(_lblDest.Text);

                    this.Stop += formatter.CancelOp;

                    DiscFormat2Data_Events ev = formatter as DiscFormat2Data_Events;
                    if (_ckUseUIReport.Checked)
                        ev.Update += FormattingEvent;
                    formatter.CreateFullImage(imageResult);
                    _tm.Stop();
                    _lblUpdate.Text = formatter.Cancel ? "Canceled on UI Thread" :
                         string.Format("Creating {1}  of size {2} on UI thread lasted {0}",
                        _tm.Elapsed.ToString(), Path.GetFileName(_lblDest.Text), (new FileInfo(_lblDest.Text)).Length.ToString("#,#"));
                    if(!formatter.Cancel)
                        _progBar.Value = 200;
                }

            }
            catch (COMException ex)
            {
                Console.Beep();
                if (ex.ErrorCode == -1062555360)
                {
                    _lblUpdate.Text = "On UI Thread: Media size could be too small for the amount of data";
                }
                else
                    _lblUpdate.Text = "On UI Thread: " + ex.Message;
                File.Delete(_lblDest.Text);
            }
            catch (Exception ex)
            {
                if (!this.IsDisposed)
                {
                    if (_repository.Cancel)
                        _lblUpdate.Text = "Canceled on UI thread";
                    else
                    {
                        Console.Beep();
                        _lblUpdate.Text = "Failed on UI thread: " + ex.Message;
                    }
                }
                File.Delete(_lblDest.Text);
            }
            finally
            {
                if (_repository.Cancel)
                    File.Delete(_lblDest.Text);
                if (!_ckWorker.Checked)
                    RestoreUI(formatter);

            }
        }

        private IFileSystemImage InitRepository()
        {
            foreach (TabPage tab in _tabBuild.TabPages)
            {
                foreach (Control ctr in tab.Controls)
                    ctr.Enabled = false;
            }
            _btnBuildFile.Text = "Cancel";
            Application.DoEvents();
            IFileSystemImage ifsi = _repository as IFileSystemImage;
            FsiFileSystems fstype = FsiFileSystems.FsiFileSystemNone;
            fstype |= _ckbISO9660.Checked ? FsiFileSystems.FsiFileSystemISO9660 : FsiFileSystems.FsiFileSystemNone;
            fstype |= _ckbJoliet.Checked ? FsiFileSystems.FsiFileSystemJoliet : FsiFileSystems.FsiFileSystemNone;
            fstype |= _ckbUDF.Checked ? FsiFileSystems.FsiFileSystemUDF : FsiFileSystems.FsiFileSystemNone;
            ifsi.FileSystemsToCreate = fstype;

            ifsi.ChooseImageDefaultsForMediaType((IMAPI_MEDIA_PHYSICAL_TYPE)_cbxMediaType.SelectedItem);
            ifsi.VolumeName = _txtVolName.Text;

            this.Stop += _repository.CancelOp;
            try
            {
                if (_ckUseUIReport.Checked)
                {
                    if (_ckWorker.Checked)
                        _repository.Update += new DiscFormat2Data_EventsHandler(AsyncRepositoryUpdate);
                    else
                        _repository.Update += new DiscFormat2Data_EventsHandler(RepositoryUpdate);
                    this.Cursor = Cursors.WaitCursor;
                    _lblUpdate.Text = string.Format("Calculating size for {0}...", _lblDest.Text);
                    Application.DoEvents();
#if DEBUG
                    Stopwatch tm = new Stopwatch();
                    tm.Start();
#endif
                    try
                    {
                        if (_ckWorker.Checked)
                            _progBar.Style = ProgressBarStyle.Marquee;
                        _repository.CalculateSizeBeforeFormatting();
                    }
                    finally
                    {
                        if (_ckWorker.Checked)
                            _progBar.Style = ProgressBarStyle.Continuous;

                    }
#if DEBUG
                    tm.Stop();
                    System.Diagnostics.Debug.WriteLine(string.Format("CalculateSizeBeforeFormatting the image lasted {0} ms", tm.Elapsed.TotalMilliseconds.ToString("#,#")));
#endif
                }
                else
                {
                    if (_ckWorker.Checked)
                        _progBar.Style = ProgressBarStyle.Marquee;
                    _lblUpdate.Text = string.Format("Creating {0}...", _lblDest.Text);
                }
            }
            finally
            {
                this.Cursor = Cursors.Arrow;
            }

            return ifsi;
        }

        private void RestoreUI(ISOFormatter formatter)
        {
            if (_ckUseUIReport.Checked)
            {
                if (_ckWorker.Checked)
                    _repository.Update -= new DiscFormat2Data_EventsHandler(AsyncRepositoryUpdate);
                else
                    _repository.Update -= new DiscFormat2Data_EventsHandler(RepositoryUpdate);
            }

            _btnBuildFile.Text = "生成文件(&B)";

            if (formatter != null)
            {
                DiscFormat2Data_Events ev = formatter as DiscFormat2Data_Events;
                if (ev != null)
                {
                    if (_ckUseUIReport.Checked)
                    {
                        if (_ckWorker.Checked)
                            ev.Update -= AsyncFormattingEvent;
                        else
                            ev.Update -= FormattingEvent;
                    }
                    this.Stop -= formatter.CancelOp;
                }

                (formatter as IDisposable).Dispose();
                formatter = null;
            }


            this.Stop -= _repository.CancelOp;

            _repository.Reset();
            foreach (TabPage tab in _tabBuild.TabPages)
            {

                foreach (Control ctr in tab.Controls)
                    ctr.Enabled = true;
            }

            _tm.Reset();
            if (_ckWorker.Checked)
                _progBar.Style = ProgressBarStyle.Continuous;

        }

        void RunWorkerCompletedEvent(object sender, RunWorkerCompletedEventArgs e)
        {

            _backgroundWorker.DoWork -= new DoWorkEventHandler(backgroundWorker_DoWork);
            _backgroundWorker.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(RunWorkerCompletedEvent);
            _tm.Stop();
            if (e.Cancelled)
            {
                _lblUpdate.Text = "Canceled on the worker thread";
                File.Delete(_lblDest.Text);
            }
            else
                if (e.Error != null)
                {
                    Console.Beep();
                    _lblUpdate.Text = "Err on the worker thread: " + e.Error.Message;
                    File.Delete(_lblDest.Text);
                }
                else
                {
                    _lblUpdate.Text = string.Format("Creating {1}  of size {2} on worker thread lasted {0}",
                        _tm.Elapsed.ToString(), Path.GetFileName(_lblDest.Text), (new FileInfo(_lblDest.Text)).Length.ToString("#,#"));
                    _progBar.Value = 200;
                }
            ISOFormatter frm = null;
            if (!e.Cancelled && e.Error == null)
                frm = e.Result as ISOFormatter;

            RestoreUI(frm);

        }

        private void _openFileDialog_FileOk(object sender, CancelEventArgs e)
        {
            if (!_repository.AddNewFile(_openFileDialog.FileName))
            {
                MessageBox.Show(sender as IWin32Window, _openFileDialog.FileName + " is already added");
                e.Cancel = true;
            }
        }



        private void _btnAddFile_Click(object sender, EventArgs e)
        {
            if (_openFileDialog.ShowDialog(this) == DialogResult.OK)
            {
                string path = _openFileDialog.FileName;
                _AddFile(path);

            }

        }

        private void _AddFile(string path)
        {
            if (_repository.AddNewFile(path))
            {
                _bindingSource.ResetBindings(false);
                List<FileSystemInfo> fli = _bindingSource.List as List<FileSystemInfo>;
                for (int i = 0; i < fli.Count; i++)
                {
                    FileSystemInfo fi = fli[i];
                    _dataGridView.Rows[i].Cells["Type"].Value = ((fi.Attributes & FileAttributes.Directory) == 0) ? "File" : "Folder";
                }
            }
            else
                Console.Beep();

        }

        private void _btnAddFolder_Click(object sender, EventArgs e)
        {

            if (_folderBrowserDialog.ShowDialog(this) == DialogResult.OK)
            {
                string path = _folderBrowserDialog.SelectedPath;
                _AddFolder(path);
            }

        }

        private void _AddFolder(string path)
        {
            if (!_repository.AddNewFolder(path))
            {
                Console.Beep();
                MessageBox.Show(this, path + " is already added", "error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
            else
            {
                _bindingSource.ResetBindings(false);
                List<FileSystemInfo> fli = _bindingSource.List as List<FileSystemInfo>;
                for (int i = 0; i < fli.Count; i++)
                {
                    FileSystemInfo fi = fli[i];
                    _dataGridView.Rows[i].Cells["Type"].Value = ((fi.Attributes & FileAttributes.Directory) == 0) ? "File" : "Folder";
                }

            }
        }

        private void _SaveAs_Click(object sender, EventArgs e)
        {
            if (_saveFileDialog.ShowDialog(this) == DialogResult.OK)
            {
                _lblDest.Text = _saveFileDialog.FileName;
            }
        }


        private void ISOBuilderForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (Stop != null && Stop.GetInvocationList().Length > 0)
                Stop();
        }

        protected override void WndProc(ref Message m)
        {

            if (m.WParam.ToInt32() == About.IDM_ABOUT)
            {
                About dlg = new About(this);
                dlg.ShowDialog();
                dlg.Dispose();
            }
            base.WndProc(ref m);
        }

        private void _btnAbout_Click(object sender, EventArgs e)
        {
            About dlg = new About(this);
            dlg.ShowDialog();
            dlg.Dispose();
        }

        private void tabPage1_DragDrop(object sender, DragEventArgs e)
        {
            Array arr = (Array)e.Data.GetData(DataFormats.FileDrop);
            if (arr != null && arr.Length > 0)
            {
                SetForegroundWindow(this.Handle);
                string path = arr.GetValue(0) as string;
                if (File.Exists(path))
                {
                    _AddFile(path);
                }
                else if (Directory.Exists(path))
                {
                    _AddFolder(path);
                }
            }
        }

        private void tabPage1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = e.Data.GetDataPresent(DataFormats.FileDrop) ? DragDropEffects.Copy : DragDropEffects.None;

        }


    }

}

[源代码打包下载]




网友评论    (发表评论)

共1 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...