基本信息
源码名称:VS2017离线安装工具 源码
源码大小:0.10M
文件格式:.rar
开发语言:C#
更新时间:2018-07-12
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
1、程序版本:根据下拉选择需要的版本(社区、专业、企业),如果程序目录没有指定版本的离线工具,会显示下载链接,点击下载即可
2、缓存目录:离线文件存储目录3、保存设置:可以保存设置好的程序版本和缓存目录用于下次使用
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace vs2017离线安装操作
{
// 1.定义委托
public delegate void DelReadStdOutput(string result);
public delegate void DelReadErrOutput(string result);
public partial class MainForm : Form
{
// 2.定义委托事件
public event DelReadStdOutput ReadStdOutput;
public event DelReadErrOutput ReadErrOutput;
string baseFromPath = "https://aka.ms/vs/15/release/";
string baseDownPath = System.Environment.CurrentDirectory;
Process cmd = null;
string isRun = "start";
string shell = "ping www.baidu.com";
public MainForm()
{
InitializeComponent();
Init();
}
private void Init()
{
//3.将相应函数注册到委托事件中
ReadStdOutput = new DelReadStdOutput(ReadStdOutputAction);
ReadErrOutput = new DelReadErrOutput(ReadErrOutputAction);
}
private void btnSelectDir_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.ShowNewFolderButton = true;
DialogResult result = fbd.ShowDialog();
if(result==DialogResult.OK)
{
txtSaveDirectory.Text = fbd.SelectedPath;
}
}
/// <summary>
/// 根据下拉选项判断文件名称
/// </summary>
/// <returns></returns>
string getFileNameByTypeCombox()
{
string fromPath = "";
string typestr = comboBox1.SelectedItem.ToString();
if (typestr == "Visual Studio Community 2017(社区版)")
{
fromPath = "vs_community社区.exe";
}
else if (typestr == "Visual Studio Professional 2017(专业版)")
{
fromPath = "vs_professional专业.exe";
}
else if (typestr == "Visual Studio Enterprise 2017(企业版)")
{
fromPath = "vs_enterprise企业.exe";
}
return fromPath;
}
private void linkLabel1_Click(object sender, EventArgs e)
{
string fromPath = baseFromPath getFileNameByTypeCombox();
string savePath = baseDownPath "\\" getFileNameByTypeCombox();
DownFile df = new DownFile(fromPath, savePath);
df.StartPosition = FormStartPosition.CenterParent;
DialogResult result= df.ShowDialog();
if(result==DialogResult.OK)
{
comboBox1_SelectedIndexChanged(null, null);
MessageBoxEx.Show("下载成功!");
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo(System.Environment.CurrentDirectory);
FileInfo[] files = di.GetFiles(getFileNameByTypeCombox());
if(files.Length>0)
{
linkLabel1.Visible = false;
}
else
{
linkLabel1.Visible = true;
}
}
public delegate string MyDelegate();
private void RealAction(string StartCmd)
{
Process CmdProcess = new Process();
CmdProcess.StartInfo.FileName = "cmd.exe"; // 命令
//CmdProcess.StartInfo.Arguments = StartFileArg; // 参数
CmdProcess.StartInfo.WorkingDirectory = ".";
CmdProcess.StartInfo.CreateNoWindow = true; // 不创建新窗口
CmdProcess.StartInfo.UseShellExecute = false; // 是否使用shell
CmdProcess.StartInfo.RedirectStandardInput = true; // 重定向输入
CmdProcess.StartInfo.RedirectStandardOutput = true; // 重定向标准输出
CmdProcess.StartInfo.RedirectStandardError = true; // 重定向错误输出
//CmdProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
CmdProcess.OutputDataReceived = new DataReceivedEventHandler(p_OutputDataReceived);
CmdProcess.ErrorDataReceived = new DataReceivedEventHandler(p_ErrorDataReceived);
CmdProcess.EnableRaisingEvents = true; // 启用Exited事件
CmdProcess.Exited = new EventHandler(CmdProcess_Exited); // 注册进程结束事件
CmdProcess.Start();
//输入命令
CmdProcess.StandardInput.WriteLine(StartCmd);
CmdProcess.BeginOutputReadLine();
CmdProcess.BeginErrorReadLine();
// 如果打开注释,则以同步方式执行命令,此例子中用Exited事件异步执行。
// CmdProcess.WaitForExit();
}
private void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
// 4. 异步调用,需要invoke
this.Invoke(ReadStdOutput, new object[] { e.Data });
}
}
private void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
this.Invoke(ReadErrOutput, new object[] { e.Data });
}
}
/// <summary>
/// 输出命令信息
/// </summary>
/// <param name="result"></param>
private void ReadStdOutputAction(string result)
{
this.txtcmdLogTextArea.AppendText(result "\r\n");
}
/// <summary>
/// 输出错误信息
/// </summary>
/// <param name="result"></param>
private void ReadErrOutputAction(string result)
{
//this.textBoxShowErrRet.AppendText(result "\r\n");
}
private void CmdProcess_Exited(object sender, EventArgs e)
{
// 执行结束后触发
}
/// <summary>
/// 保存设置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSave_Click(object sender, EventArgs e)
{
string configFileName = Application.ExecutablePath ".config";
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(configFileName);
string configString = @"configuration/applicationSettings/vs2017离线安装操作.Properties.Settings/setting[@name='程序版本']/value";
System.Xml.XmlNode configNode = doc.SelectSingleNode(configString);
if (configNode != null)
{
configNode.InnerText = comboBox1.SelectedItem.ToString();
doc.Save(configFileName);
}
configString = @"configuration/applicationSettings/vs2017离线安装操作.Properties.Settings/setting[@name='缓存目录']/value";
configNode = doc.SelectSingleNode(configString);
if (configNode != null)
{
configNode.InnerText = txtSaveDirectory.Text.Trim();
doc.Save(configFileName);
// 刷新应用程序设置,这样下次读取时才能读到最新的值。
Properties.Settings.Default.Reload();
}
// 刷新应用程序设置,这样下次读取时才能读到最新的值。
Properties.Settings.Default.Reload();
//if (comboBox1.SelectedIndex > -1)
//{
// Properties.Settings.Default.["程序版本"] = comboBox1.SelectedItem.ToString();
//}
//else
//{
// Properties.Settings.Default["程序版本"] = "";
//}
//Properties.Settings.Default["缓存目录"] = txtSaveDirectory.Text.Trim();
//Properties.Settings.Default.Save();
MessageBoxEx.Show(this, "保存成功", "提示");
}
private void btnDown_Click(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex == -1)
{
MessageBoxEx.Show(this, "请选择程序版本", "提示");
return;
}
else
{
if (linkLabel1.Visible)
{
MessageBoxEx.Show(this, "请先下载相关程序", "提示");
return;
}
}
if (txtSaveDirectory.Text.ToString() == "")
{
MessageBoxEx.Show(this, "请选择缓存目录", "提示");
return;
}
else
{
if (!Directory.Exists(txtSaveDirectory.Text.Trim()))
{
MessageBoxEx.Show(this, "缓存目录不存在,请检查后重试", "提示");
return;
}
}
string cmdstr = getFileNameByTypeCombox() " --layout " txtSaveDirectory.Text.Trim() " --lang Zh-cn";
RealAction(cmdstr);
}
private void btnClean_Click(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex == -1)
{
MessageBoxEx.Show(this, "请选择程序版本", "提示");
return;
}
else
{
if (linkLabel1.Visible)
{
MessageBoxEx.Show(this, "请先下载相关程序", "提示");
return;
}
}
if (txtSaveDirectory.Text.ToString() == "")
{
MessageBoxEx.Show(this, "请选择缓存目录", "提示");
return;
}
else
{
if (!Directory.Exists(txtSaveDirectory.Text.Trim()))
{
MessageBoxEx.Show(this, "缓存目录不存在,请检查后重试", "提示");
return;
}
}
//判断根目录
DirectoryInfo di = new DirectoryInfo(txtSaveDirectory.Text.ToString());
DirectoryInfo[] dilist = di.GetDirectories("Archive");
if(dilist.Length==0)
{
MessageBoxEx.Show(this, "当前缓存目录下文件无需清理", "提示");
return;
}
//判断指定目录
di = dilist[0];
dilist = di.GetDirectories();
if (dilist.Length == 0)
{
MessageBoxEx.Show(this, "当前缓存目录下文件无需清理", "提示");
return;
}
//获取最新目录的名称
string cleanpath = txtSaveDirectory.Text.Trim() "\\Archive\\" dilist[0].Name "\\Catalog.json";
dilist.OrderByDescending(a => a.CreationTime);
string cmdstr = getFileNameByTypeCombox() " --layout " txtSaveDirectory.Text.Trim() " --clean " cleanpath;
RealAction(cmdstr);
}
private void MainForm_Shown(object sender, EventArgs e)
{
if(Properties.Settings.Default["程序版本"].ToString()!="")
{
comboBox1.SelectedItem = Properties.Settings.Default["程序版本"].ToString();
}
if(Properties.Settings.Default["缓存目录"].ToString() != "")
{
txtSaveDirectory.Text = Properties.Settings.Default["缓存目录"].ToString();
}
}
}
}