平常經常用到虛擬機,每次從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;
}
}
}
}