/// <summary> /// 把指定值加入到Path环境变量中去 /// </summary> /// <param name="value">指定值(末尾如果有分号或者反斜杠会被去除)</param> /// <param name="append">为true时将值追加到Path变量之后,否则插入到最前</param> public static void AddValueToPath(string value, bool append) { // 先获取Path变量值 List <string> originValues = new List <string>(RegUtils.GetPathVariable(false)); // 处理传入值 value = FilePathUtils.RemovePathEndBackslash(value.Replace("/", "\\")); // 检查重复 if (ListUtils.ListContainsIgnoreCase(originValues, value)) { MessageBox.Show("该路径已经存在于Path变量中!无需再次添加!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } // 开始加入 if (append) { originValues.Add(value); } else { originValues.Insert(0, value); } // 保存Path变量值 if (SavePath(originValues.ToArray())) { MessageBox.Show("已成功添加路径至Path变量!若没有立即生效,请关闭现有已打开终端或者重启电脑再试!", "完成", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("添加路径到Path变量失败!请关闭该程序然后右键-以管理员身份运行该程序再试!", "失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
/// <summary> /// 把Path变量中的C:\Windows替换为%SystemRoot%的引用形式 /// </summary> /// <returns>返回已经替换成系统引用后的Path变量副本</returns> public static string[] ReplacePathSystemRootReference() { string systemRootValue = Environment.GetFolderPath(Environment.SpecialFolder.Windows); string systemRootName = "%SystemRoot%"; string[] pathValues = RegUtils.GetPathVariable(false); for (int i = 0; i < pathValues.Length; i++) { string prefix; // 检测路径是否是C:\Windows打头 if (pathValues[i].Length >= systemRootValue.Length) { prefix = pathValues[i].Substring(0, systemRootValue.Length); if (prefix.Equals(systemRootValue, StringComparison.CurrentCultureIgnoreCase)) { pathValues[i] = pathValues[i].Replace(prefix, systemRootName); continue; } } // 否则,规整大小写 if (pathValues[i].Length >= systemRootName.Length) { prefix = pathValues[i].Substring(0, systemRootName.Length); if (prefix.Equals(systemRootName, StringComparison.CurrentCultureIgnoreCase) && !prefix.Equals(systemRootName)) { pathValues[i] = pathValues[i].Replace(prefix, systemRootName); } } } return(pathValues); }
/// <summary> /// 返回格式化后的Path变量的副本(将斜杠换成反斜杠并去掉末尾的反斜杠) /// </summary> /// <param name="expand">是否展开其中的变量引用</param> /// <returns>格式化后的Path变量列表</returns> public static string[] GetFormatedPathValues(bool expand) { string[] pathValues = RegUtils.GetPathVariable(expand); for (int i = 0; i < pathValues.Length; i++) { pathValues[i] = FilePathUtils.RemovePathEndBackslash(pathValues[i].Replace("/", "\\")); } return(pathValues); }
/// <summary> /// 把一个数组保存为环境变量Path的值 /// </summary> /// <param name="pathValues">给定数组</param> /// <returns>是否保存成功</returns> public static bool SavePath(string[] pathValues) { string saveTotalValue = string.Join(";", pathValues) + ";"; RunSetx("Path", saveTotalValue, true); if (saveTotalValue.Equals(string.Join(";", RegUtils.GetPathVariable(false)) + ";")) { return(true); } return(false); }
/// <summary> /// 管理Path窗口初始化 /// </summary> private void ManagePathForm_Load(object sender, EventArgs e) { string[] pathValues = RegUtils.GetPathVariable(false); foreach (string value in pathValues) { pathContentValue.Items.Add(value); } buttonToolTip.SetToolTip(up, "上移选定元素"); buttonToolTip.SetToolTip(down, "下移选定元素"); buttonToolTip.SetToolTip(remove, "移除选定元素"); buttonToolTip.SetToolTip(add, "在选定元素之后插入路径,若未选择元素则在尾部插入"); buttonToolTip.SetToolTip(edit, "编辑所选元素,也可以双击相应的元素进行编辑"); }
/// <summary> /// 从Path环境变量中移除不存在的路径 /// </summary> /// <returns>返回移除了不存在的路径后的Path变量</returns> public static string[] RemoveNotExistPathInPathValues() { List <string> result = new List <string>(RegUtils.GetPathVariable(false)); Dictionary <string, string> variables = GetVariablesInPath(); string eachPath; for (int i = 0; i < result.Count; i++) { // 如果这个值中包含%,说明是变量引用形式,获取其实际值 if (result[i].Contains("%")) { // 变量列表中不存在该值,说明这个值是不存在的路径 eachPath = FilePathUtils.RemovePathEndBackslash(result[i].Replace("/", "\\")); if (!variables.ContainsKey(eachPath)) { result.RemoveAt(i); i--; continue; } eachPath = FilePathUtils.RemovePathEndBackslash(variables[eachPath].Replace("/", "\\")); // 否则,进一步检测其对应路径是否存在 if (!Directory.Exists(eachPath) && !File.Exists(eachPath)) { result.RemoveAt(i); i--; } } else { // 否则就是普通路径,检测是否存在即可 eachPath = FilePathUtils.RemovePathEndBackslash(result[i].Replace("/", "\\")); if (!Directory.Exists(eachPath) && !File.Exists(eachPath)) { result.RemoveAt(i); i--; } } } return(result.ToArray()); }