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

📄 formwriteimagedisk.cs

📁 Linux 恢复盘制作工具 process调用busybox dd实现写*.img镜像
💻 CS
📖 第 1 页 / 共 2 页
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;



using System.Management;
using System.Collections.Specialized;
using System.Collections;
using System.Threading;
using System.IO;
using System.Diagnostics;
 

namespace WrtImg
{
    public partial class FormWriteImageDisk : Form
    {
        public FormWriteImageDisk()
        {
            InitializeComponent();
        }

        bool closeform = false;
      
        private void FormWriteImageDisk_Load(object sender, EventArgs e)
        {
            olvColumnDevName.AspectGetter = delegate(object x) { return ((DeviceInfo)x).DeviceName; };
            olvColumnDevSize.AspectGetter = delegate(object x) { return ((DeviceInfo)x).DeviceSize; };

            //ThreadPool.QueueUserWorkItem(new WaitCallback(FindUSBDisk));
            Thread ss = new Thread(new ParameterizedThreadStart(FindUSBDisk));
            ss.IsBackground = true;
            ss.Start(ss);
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.AutoReset = true;
        }
        private void buttonQuit_Click(object sender, EventArgs e)
        {
            closeform = true;
            Application.Exit();
        }
        private void buttonSelectImageFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "Recovery Image|*.img";
            ofd.Multiselect = false;
            ofd.Title = "Select a image file for create recovery disk";
            if (ofd.ShowDialog() == DialogResult.OK) {
                textBoxSelectImageFile.Text = ofd.FileName;           
            }
        }

        private void comboBoxSelectDrive_DropDown(object sender, EventArgs e)
        {
            //if (getLogicalUsbDisks() != null)
            //{
            //    comboBoxSelectDrive.Items.Clear();
            //    comboBoxSelectDrive.Items.AddRange(getLogicalUsbDisks());
            //}
        }

     
        private void buttonMake_Click(object sender, EventArgs e)
        {
            if (olvDevices.CheckedItems.Count != 1) {
                MessageBox.Show("Check a usb disk,please."); return; 
            }
                     
            if (string.IsNullOrEmpty(textBoxSelectImageFile.Text )) {
                MessageBox.Show("Need to select *.img file for create recovery disk."); return; 
            }
            BackgroundWorker worker = new BackgroundWorker();
            worker.WorkerReportsProgress = true;
            worker.WorkerSupportsCancellation = true;
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
            worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);

            DialogResult dr = MessageBox.Show("Make sure disk is ready","",MessageBoxButtons .YesNo );
            if (dr == DialogResult.Yes)
            {
                if (!File.Exists(textBoxSelectImageFile.Text)) {
                    MessageBox.Show("File isn't exists.", textBoxSelectImageFile.Text);
                    return;
                }
                DeviceInfo dev = olvDevices.CheckedObject as DeviceInfo;
                string cmdinfo = string.Format(" dd bs=4096k if={0} of={1}", textBoxSelectImageFile.Text, dev.DeviceName);//busybox.exe
           //busybox.exe dd bs=4096k if=H:\boot\imgs\xly.img of=/dev/sdb
                if (worker.IsBusy)
                {
                    MessageBox.Show("It's working busy."); return;
                }
                buttonMake.Enabled = false;
                worker.RunWorkerAsync(cmdinfo);                 
            }
        }
        int busyboxProcessID = -1;
        System.Timers.Timer timer = new System.Timers.Timer(4000);
        delegate void progresshandler(int progress);
        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            //MessageBox.Show(e.SignalTime.ToString ());
            for (int t = 0; t < 40; t++)
            {
                progressBar1.Invoke(new progresshandler(delegate(int value) { progressBar1.Value = value; }), t);
                System.Threading.Thread.Sleep(20);
            }
        }
        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bgw = (BackgroundWorker)sender;
            string cmdinfo = e.Argument.ToString();
            //MessageBox.Show(cmdinfo);
            //if (!File.Exists("busybox.exe")) { MessageBox.Show("[busybox.exe] File isn't exists"); return; }
            //if (!File.Exists("cygcrypt-0.dll")) { MessageBox.Show("[cygcrypt-0.dll] File isn't exists"); return; }
            //if (!File.Exists("cygwin1.dll")) { MessageBox.Show("[cygwin1.dll] File isn't exists"); return; } 
            Process p = new Process();
            //p.StartInfo.FileName = "busybox.exe";
            ProcessStartInfo pstartinfo = new ProcessStartInfo("busybox.exe", cmdinfo);
            p.StartInfo = pstartinfo;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
            p.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
            p.Exited += new EventHandler(p_Exited);
            timer.Enabled = true;
            p.Start();
            busyboxProcessID = p.Id;
            string strOutput = string.Empty;
            //p.StandardInput.WriteLine(cmdinfo);
            p.StandardInput.WriteLine("busybox.exe ps");
/*         
E:\EMP600\workspace\WrtImg\WrtImg\bin\Release>busybox.exe dd bs=4096k if=H:\boot
\imgs\maxdos.img of=/dev/sdb
2+1 records in
2+1 records out
*/
            p.BeginErrorReadLine();
            p.BeginOutputReadLine();
            //bool finished = false;
            //while (!finished) {              
            //    strOutput = p.StandardOutput.ReadLine();
            //    //strOutput = p.StandardOutput.ReadToEnd();
            //    MessageBox.Show(strOutput+"3");
            //    if (strOutput.Contains("records out")) {
            //        MessageBox.Show(strOutput);
            //        p.StandardInput.WriteLine("exit");
            //        finished = true;
            //    }
            //}
        
            p.WaitForExit();
            ////p.Kill();
            p.Close();
        }
        delegate void SetLableText(string str);
        void sdf(string txt)
        {
            label4.Text = txt;
        }

        void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            
            string strOutput = e.Data;
            if (strOutput == null) return;
            if (strOutput.Contains("records out"))
            {
                //MessageBox.Show("Done!" + e.Data);
                MessageBox.Show("Create Finished!");
                label4.Invoke(new SetLableText(delegate(string o) { label4.Text = o.ToString(); }), new object[] { "" });
                buttonMake.Invoke (new  buttonEnable(delegate(bool o) {buttonMake.Enabled =o;}), new object[] { true  });
                timer.Enabled = false;
                timer.Stop();
                timer.Close();
                progressBar1.Invoke(new progresshandler(delegate(int value) { progressBar1.Value = value; }), 0);
                closeform = true;
            }
            else {
                label4.Invoke(new SetLableText(delegate(string o) { label4.Text += o.ToString(); }), new object[] { "waiting" });
                //for (int i = 0; i > 10; i++)
                //{
                 
                //    Thread.Sleep(30);
                //    label4.Invoke(new SetLableText(delegate(string o) { label4.Text += o.ToString(); }), new object[] { " " });
                //    Thread.Sleep(30);
                //}
            }
        }
        delegate void buttonEnable(bool o);
        void p_Exited(object sender, EventArgs e)
        {
            
        }

⌨️ 快捷键说明

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