GHO2VMDK轉換工具分享含VS2010源碼

来源:http://www.cnblogs.com/InfoStudio/archive/2017/09/02/7467504.html
-Advertisement-
Play Games

平常經常用到虛擬機,每次從gho轉換為vmdk時都要輸入cmd代碼,覺得麻煩,自己動手做了個gho2vmdk轉換工具,集成ghost32.exe文件,可以一鍵轉換,省時省事。運行時會將ghost32.exe保存到Program FIles文件夾里,運行完自動刪除ghost32.exe。覺得還不錯,在 ...


平常經常用到虛擬機,每次從gho轉換為vmdk時都要輸入cmd代碼,覺得麻煩,自己動手做了個gho2vmdk轉換工具,集成ghost32.exe文件,可以一鍵轉換,省時省事。運行時會將ghost32.exe保存到Program FIles文件夾里,運行完自動刪除ghost32.exe。覺得還不錯,在此分享一下,有什麼好的建議,歡迎反饋。代碼貼上。需要完整工程的請留言郵箱。開發工具為VS2010,沒用任何第三方插件。覺得有幫助舉手點個推薦。

 

程式下載地址:鏈接:http://pan.baidu.com/s/1bp2HBw7 密碼:jpw4

 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using GHO2VMDK轉換工具.Properties;

namespace GHO2VMDK轉換工具
{
    public partial class Form1 : Form
    {
        private string _ghost32ExeFullName;

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Form1_Load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            //啟用拖放
            txtGhoFullName.AllowDrop = true;
            //在拖入邊界時發生
            txtGhoFullName.DragEnter += (s1, e1) =>
            {
                if (e1.Data.GetDataPresent(DataFormats.FileDrop))
                {
                    e1.Effect = DragDropEffects.Link;
                }
                else
                {
                    e1.Effect = DragDropEffects.None;
                }
            };

            //在拖放完成時發生
            txtGhoFullName.DragDrop += (s1, e1) =>
            {
                //攻取gho文件路徑
                string tmpPath = ((Array) (e1.Data.GetData(DataFormats.FileDrop))).GetValue(0).ToString();
                string extension = Path.GetExtension(tmpPath);
                if (extension.ToLower() == ".gho")
                    txtGhoFullName.Text = tmpPath;
                else
                    MessageBox.Show("請拖放GHO文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            };
        }

        /// <summary>
        /// txtGhoFullName_TextChanged
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtGhoFullName_TextChanged(object sender, EventArgs e)
        {
            //根據gho文件路徑,自動設置vmdk文件預設保存路徑
            string ghoFullName = txtGhoFullName.Text;
            string directoryName = Path.GetDirectoryName(ghoFullName);
            string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(ghoFullName);
            if (directoryName != null)
            {
                string vmdkFullName = Path.Combine(directoryName, fileNameWithoutExtension + ".vmdk");
                txtVmdkFullName.Text = vmdkFullName;
            }
        }

        /// <summary>
        /// btnStartConvert_Click
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnStartConvert_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("是否開始將GHO文件轉換為VMDK文件?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                //獲取ProgramFiles路徑
                string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
                //設置ghost32.exe文件臨時保存路徑
                _ghost32ExeFullName = Path.Combine(path, "ghost32.exe");
                if (!File.Exists(_ghost32ExeFullName))
                {
                    //從資源文件讀取ghost32.exe並保存到_ghost32ExeFullName路徑
                    FileStream str = new FileStream(_ghost32ExeFullName, FileMode.OpenOrCreate);
                    str.Write(Resources.Ghost32, 0, Resources.Ghost32.Length);
                    str.Close();
                }

                //設置ghost32.exe運行參數
                string cmdText = string.Format("-clone,mode=restore,src=\"{0}\",dst=\"{1}\" -batch -sure",
                    txtGhoFullName.Text, txtVmdkFullName.Text);
                //隱蔽視窗
                WindowState = FormWindowState.Minimized;
                Hide();
                //運行ghost32.exe
                RunCmd(_ghost32ExeFullName, cmdText);
                Show();
                //顯示視窗
                WindowState = FormWindowState.Normal;
                //刪除ghost32.exe
                if (File.Exists(_ghost32ExeFullName))
                    File.Delete(_ghost32ExeFullName);

                MessageBox.Show("操作完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        /// <summary>
        ///     運行cmd命令
        ///     不會顯示命令視窗
        /// </summary>
        /// <param name="cmdExe">指定應用程式的完整路徑</param>
        /// <param name="cmdStr">執行命令行參數</param>
        private static bool RunCmd(string cmdExe, string cmdStr)
        {
            bool result = false;
            try
            {
                using (Process myPro = new Process())
                {
                    //指定啟動進程是調用的應用程式和命令行參數
                    ProcessStartInfo psi = new ProcessStartInfo(cmdExe, cmdStr);
                    psi.UseShellExecute = false;
                    psi.RedirectStandardInput = true;
                    psi.RedirectStandardOutput = true;
                    psi.RedirectStandardError = true;
                    psi.CreateNoWindow = true;

                    myPro.StartInfo = psi;
                    myPro.Start();
                    myPro.WaitForExit();
                    result = true;
                }
            }
            catch
            {
                result = false;
            }
            return result;
        }

        /// <summary>
        ///     運行cmd命令
        ///     不顯示命令視窗
        /// </summary>
        /// <param name="cmdExe">指定應用程式的完整路徑</param>
        /// <param name="cmdStr">執行命令行參數</param>
        private static bool RunCmd2(string cmdExe, string cmdStr)
        {
            bool result = false;
            try
            {
                using (Process myPro = new Process())
                {
                    myPro.StartInfo.FileName = "cmd.exe";
                    myPro.StartInfo.UseShellExecute = false;
                    myPro.StartInfo.RedirectStandardInput = true;
                    myPro.StartInfo.RedirectStandardOutput = true;
                    myPro.StartInfo.RedirectStandardError = true;
                    myPro.StartInfo.CreateNoWindow = true;
                    myPro.Start();
                    //如果調用程式路徑中有空格時,cmd命令執行失敗,可以用雙引號括起來 ,在這裡兩個引號表示一個引號(轉義)
                    string str = string.Format(@"""{0}"" {1} {2}", cmdExe, cmdStr, "&exit");

                    myPro.StandardInput.WriteLine(str);
                    myPro.StandardInput.AutoFlush = true;
                    myPro.WaitForExit();

                    result = true;
                }
            }
            catch
            {
                result = false;
            }
            return result;
        }

        private void chbTopMost_CheckedChanged(object sender, EventArgs e)
        {
            //視窗置頂
            TopMost = chbTopMost.Checked;
        }

        private void btnBrowseGhoFile_Click(object sender, EventArgs e)
        {
            //瀏覽gho文件
            string ghoFullName = txtGhoFullName.Text;

            OpenFileDialog f = new OpenFileDialog
            {
                Title = "瀏覽GHO文件...",
                Filter = "GHO文件(*.gho)|*.gho",
                FileName = ghoFullName,
                InitialDirectory = ghoFullName
            };
            if (f.ShowDialog() == DialogResult.OK)
            {
                txtGhoFullName.Text = f.FileName;
            }
        }

        private void btnBrowseVmdkFile_Click(object sender, EventArgs e)
        {
            //瀏覽VMDK文件
            string vmdkFullName = txtVmdkFullName.Text;
            SaveFileDialog f = new SaveFileDialog
            {
                Title = "設置VMDK文件保存路徑...",
                Filter = "VMDK文件(*.vmdk)|*.vmdk",
                FileName = vmdkFullName,
                InitialDirectory = vmdkFullName
            };
            if (f.ShowDialog() == DialogResult.OK)
            {
                txtVmdkFullName.Text = f.FileName;
            }
        }
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 繼上一篇文章: http://www.cnblogs.com/linhaostudy/p/7428971.html 四、file結構體 文件對象:註意文件對象描述的是進程已經打開的文件。因為一個文件可以被多個進程打開,所以一個文件可以存在多個文件對象。但是由於文件是唯一的,那麼inode就是唯一的, ...
  • Win10系統VMWare虛擬機無法連接網路的解決技巧: 第一步、打開VMWare虛擬機:依次點擊“編輯”,”虛擬網路編輯器”,“恢復預設設置” (期間要求賦予修改配置許可權、要求關閉已啟動的虛擬機),之後網路能用了。其實就是因為網路驅動有變化才導致不能用的,重裝下VMWare的網路模塊就好,正好恢復 ...
  • 學習Linux,就算是像小編我這樣的小萌新,也知道OSI模型。什麼?!你不知道!!! 好吧,這篇秘籍拿走,不謝~~~ 一、兩個協議 (1)OSI 協議模型(7層)國際協議 PDU:協議數據單元對等層次之間傳遞的數據單位 OSI協議(7層) 國際協議 PDU 單位 功能 實例 7 應用層 applic ...
  • Socket():創建套接字 Bind():綁定套接字。將一個本地協議地址賦予一個套接字 Listen():監聽套接字 Connect():建立與伺服器之間的連接。 accept():接收連接, Send():發送函數 recv():接收函數 close():關閉連接 伺服器端順序: Socket( ...
  • 版本: 主機:Windows 7 64位旗艦版 虛擬機: VMWare 12 + Windows 7 64位旗艦版 VMWare pro 12 + Ubuntu16.04LTS 64位 註:由於VMWare 10 跟 Ubuntu 16.04LTS版本不相容,會出現VMWare Tools 安裝過程 ...
  • 在 ASP.NET 中,我們知道,它有一個面向切麵的請求管道,有19個主要的事件構成,能夠讓我們進行靈活的擴展。通常是在 web.config 中通過註冊 HttpModule 來實現對請求管道事件監聽,並通過 HttpHandler 進入到我們的應用程式中。而在 ASP.NET Core 中,對請 ...
  • 有時候,我們運營的公眾號,可能因為某些原因而需要更換公眾號,比如,公司被收購,公眾號轉讓等。 那原有公眾號的粉絲,我們自然也想讓其遷移到新的公眾號上,一般做法是通過微信自帶的粉絲轉移功能。 但流程也不少,還要交300元的審核費用。最要命的是,如果你的公眾號平臺提供了一些系統,那麼用戶在系統上的資料是 ...
  • 寫在前面整個項目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp這一節內容可能會用到的庫文件有 Measurement 和 TestCase,同樣在 Github 上可以找到。善用 Ctrl + F... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...