基本信息
源码名称:VS2017离线安装工具 源码
源码大小:0.10M
文件格式:.rar
开发语言:C#
更新时间:2018-07-12
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 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();
            }
        }
    }
}