[feat] optimization for getting cs2 path + add Toast for auto path

This commit is contained in:
Purp1e
2025-03-23 01:08:50 +08:00
parent ad5a1bd870
commit e7b6d81319
12 changed files with 184 additions and 81 deletions

View File

@@ -3,35 +3,102 @@
// - CS2(CS:GO) Path
#![allow(unused)]
use anyhow::Result;
use std::fs::{self, exists};
use std::path::{Path, PathBuf};
use crate::tool::common::get_exe_path;
use anyhow::Result;
use super::reg;
pub fn get_steam_path() -> Result<String, String> {
// Running steam.exe
#[cfg(target_os = "windows")]
if let Ok(steam_path) = get_exe_path("steam") {
// 去除结尾的 steam.exe 不区分大小写
if let Some(parent_path) = Path::new(&steam_path).parent() {
return Ok(parent_path.to_string_lossy().to_string());
} else {
return Err("Failed to get parent directory".into());
}
}
// Windows Registry
#[cfg(target_os = "windows")]
if let Ok(reg) = reg::SteamReg::get_all() {
return Ok(reg.steam_path);
}
// Running steam.exe
#[cfg(target_os = "windows")]
if let Ok(steam_path) = get_exe_path("steam.exe") {
return Ok(steam_path);
}
Err("no steam path found".into())
}
pub fn get_cs_path(name: &str) -> Result<String, String> {
pub fn get_cs_path(name: &str, steam_dir: &str) -> Result<String, String> {
if name != "csgo" && name != "cs2" {
return Err("invalid cs name".into());
}
// 1. 优先检查 steam_dir 参数
let steam_path = if steam_dir.is_empty() || !Path::new(steam_dir).exists() {
// 如果 steam_dir 不满足条件,调用 get_steam_path 获取路径
let p = get_steam_path().map_err(|e| e.to_string())?;
PathBuf::from(p)
} else {
PathBuf::from(steam_dir) // 同样转换为PathBuf
};
let cs_path = steam_path
.join("steamapps\\common\\Counter-Strike Global Offensive\\game\\bin\\win64\\cs2.exe");
if cs_path.exists() {
if let Some(parent) = cs_path.parent() {
return Ok(parent.to_string_lossy().to_string());
}
}
// 2. 通过注册表读取所有磁盘盘符
#[cfg(target_os = "windows")]
if let Ok(cs_path) = get_exe_path(&(name.to_owned() + ".exe")) {
return Ok(cs_path);
{
use winreg::enums::HKEY_LOCAL_MACHINE;
use winreg::RegKey;
let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);
let mounted_devices = hklm
.open_subkey("SYSTEM\\MountedDevices")
.map_err(|e| e.to_string())?;
// 获取所有盘符
let drives: Vec<String> = mounted_devices
.enum_values()
.filter_map(|v| {
let (name, _) = v.ok()?;
let name = name.to_string();
if name.starts_with("\\DosDevices\\") {
Some(name.replace("\\DosDevices\\", ""))
} else {
None
}
})
.collect();
// 遍历盘符,尝试查找 cs2.exe
let cs_path_suffix = "SteamLibrary\\steamapps\\common\\Counter-Strike Global Offensive\\game\\bin\\win64\\cs2.exe";
for drive in drives {
let cs_path = Path::new(&drive).join(cs_path_suffix);
if cs_path.exists() {
if let Some(parent) = cs_path.parent() {
return Ok(parent.to_string_lossy().to_string());
}
}
}
}
// 3. 查找正在运行的cs2进程
#[cfg(target_os = "windows")]
if let Ok(cs2_path) = get_exe_path("cs2") {
// 去除结尾的 steam.exe 不区分大小写
if let Some(parent_path) = Path::new(&cs2_path).parent() {
return Ok(parent_path.to_string_lossy().to_string());
} else {
return Err("Failed to get parent directory".into());
}
}
Err("no cs path found".into())
@@ -46,4 +113,17 @@ mod tests {
let path = get_steam_path().unwrap();
println!("{}", path);
}
#[test]
fn test_get_cs_path() {
let result = get_cs_path("cs2", "");
assert!(result.is_ok() || result.is_err());
println!("CS2 Path: {:?}", result);
// 使用get_steam_path给到的路径
let steam_dir = get_steam_path().unwrap();
let result = get_cs_path("cs2", &steam_dir);
assert!(result.is_ok() || result.is_err());
println!("CS2 Path: {:?}", result)
}
}