Minecraft启动器开发:--gameDir参数无法使用%appdata%路径的求助
解决Minecraft启动器中--gameDir的AppData路径问题
嘿,我懂你碰到的这个麻烦——直接在ProcessStartInfo.Arguments里写%appdata%是不会生效的,因为.NET的ProcessStartInfo不会自动解析系统环境变量。咱们用C#自带的方法动态获取正确的AppData路径,这样既可靠通用,还能搞定路径的读写需求。
核心解决方案:动态获取AppData路径
在C#里,你可以用Environment.GetFolderPath()方法获取系统特殊文件夹路径,对应%appdata%的是Environment.SpecialFolder.ApplicationData,它会返回当前用户的Roaming AppData目录(比如C:\Users\你的用户名\AppData\Roaming)。
修改后的完整代码
// 获取当前用户的AppData Roaming路径 string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); // 拼接.minecraft目录路径 string minecraftDir = Path.Combine(appDataPath, ".minecraft"); ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "C:\\Program Files\\Novalis Trust\\Games\\Minecraft\\bin\\java.exe"; // 动态拼接所有需要AppData的路径,替换硬编码的用户路径 string nativesDir = Path.Combine(minecraftDir, "versions\\1.12.2\\1.12.2-natives"); string librariesPath = Path.Combine(minecraftDir, "libraries"); string versionJar = Path.Combine(minecraftDir, "versions\\1.12.2\\1.12.2.jar"); string assetsDir = Path.Combine(minecraftDir, "assets"); // 拼接Java参数,注意含空格的路径要加双引号 startInfo.Arguments = $"-XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump " + $"-Xmx1G -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:-UseAdaptiveSizePolicy -Xmn128M " + $"-Djava.library.path=\"{nativesDir}\" " + $"-cp \"{librariesPath}\\oshi-project\\oshi-core\\1.1\\oshi-core-1.1.jar;" + $"{librariesPath}\\net\\java\\dev\\jna\\jna\\4.4.0\\jna-4.4.0.jar;" + $"{librariesPath}\\net\\java\\dev\\jna\\platform\\3.4.0\\platform-3.4.0.jar;" + $"{librariesPath}\\com\\ibm\\icu\\icu4j-core-mojang\\51.2\\icu4j-core-mojang-51.2.jar;" + $"{librariesPath}\\net\\sf\\jopt-simple\\jopt-simple\\5.0.3\\jopt-simple-5.0.3.jar;" + $"{librariesPath}\\com\\paulscode\\codecjorbis\\20101023\\codecjorbis-20101023.jar;" + $"{librariesPath}\\com\\paulscode\\codecwav\\20101023\\codecwav-20101023.jar;" + $"{librariesPath}\\com\\paulscode\\libraryjavasound\\20101123\\libraryjavasound-20101123.jar;" + $"{librariesPath}\\com\\paulscode\\librarylwjglopenal\\20100824\\librarylwjglopenal-20100824.jar;" + $"{librariesPath}\\com\\paulscode\\soundsystem\\20120107\\soundsystem-20120107.jar;" + $"{librariesPath}\\io\\netty\\netty-all\\4.1.9.Final\\netty-all-4.1.9.Final.jar;" + $"{librariesPath}\\com\\google\\guava\\guava\\21.0\\guava-21.0.jar;" + $"{librariesPath}\\org\\apache\\commons\\commons-lang3\\3.5\\commons-lang3-3.5.jar;" + $"{librariesPath}\\commons-io\\commons-io\\2.5\\commons-io-2.5.jar;" + $"{librariesPath}\\commons-codec\\commons-codec\\1.10\\commons-codec-1.10.jar;" + $"{librariesPath}\\net\\java\\jinput\\jinput\\2.0.5\\jinput-2.0.5.jar;" + $"{librariesPath}\\net\\java\\jutils\\jutils\\1.0.0\\jutils-1.0.0.jar;" + $"{librariesPath}\\com\\google\\code\\gson\\gson\\2.8.0\\gson-2.8.0.jar;" + $"{librariesPath}\\com\\mojang\\authlib\\1.5.25\\authlib-1.5.25.jar;" + $"{librariesPath}\\com\\mojang\\realms\\1.10.19\\realms-1.10.19.jar;" + $"{librariesPath}\\org\\apache\\commons\\commons-compress\\1.8.1\\commons-compress-1.8.1.jar;" + $"{librariesPath}\\org\\apache\\httpcomponents\\httpclient\\4.3.3\\httpclient-4.3.3.jar;" + $"{librariesPath}\\commons-logging\\commons-logging\\1.1.3\\commons-logging-1.1.3.jar;" + $"{librariesPath}\\org\\apache\\httpcomponents\\httpcore\\4.3.2\\httpcore-4.3.2.jar;" + $"{librariesPath}\\it\\unimi\\dsi\\fastutil\\7.1.0\\fastutil-7.1.0.jar;" + $"{librariesPath}\\org\\apache\\logging\\log4j\\log4j-api\\2.8.1\\log4j-api-2.8.1.jar;" + $"{librariesPath}\\org\\apache\\logging\\log4j\\log4j-core\\2.8.1\\log4j-core-2.8.1.jar;" + $"{librariesPath}\\org\\lwjgl\\lwjgl\\lwjgl\\2.9.4-nightly-20150209\\lwjgl-2.9.4-nightly-20150209.jar;" + $"{librariesPath}\\org\\lwjgl\\lwjgl\\lwjgl_util\\2.9.4-nightly-20150209\\lwjgl_util-2.9.4-nightly-20150209.jar;" + $"{librariesPath}\\com\\mojang\\text2speech\\1.10.3\\text2speech-1.10.3.jar;" + $"{versionJar}\" " + $"net.minecraft.client.main.Main " + $"--version 1.12.2 " + $"--gameDir \"{minecraftDir}\" " + $"--assetsDir \"{assetsDir}\" " + $"--assetIndex 1.12 " + $"--uuid %GUID% " + $"--accessToken %GUID% " + $"--userType legacy " + $"--versionType ${Cotswold-Chine}";
关键要点说明
- 动态路径获取:用
Environment.GetFolderPath()替代硬编码路径,适配不同用户和系统,避免依赖环境变量解析。 - 路径拼接:用
Path.Combine()拼接路径,自动处理系统路径分隔符,更跨平台友好。 - 空格处理:所有含空格的路径用双引号包裹,防止Java解析参数时出错。
AppData路径的读写操作示例
既然你需要对该路径进行读写,这里给两个简单示例:
- 读取文件:
string optionsFile = Path.Combine(minecraftDir, "options.txt"); if (File.Exists(optionsFile)) { string content = File.ReadAllText(optionsFile); // 处理文件内容 }
- 写入文件:
string newModPath = Path.Combine(minecraftDir, "mods\\new_mod.jar"); // 假设你有mod文件的字节数组 byte[] modBytes = /* 你的mod文件字节数据 */; File.WriteAllBytes(newModPath, modBytes);
这样修改后,你的启动器就能正确识别AppData路径,也能顺利进行读写操作啦!
内容的提问来源于stack exchange,提问作者Union Memeory Server
相关产品推荐
相关产品推荐

