Process.Start路径含空格需用ProcessStartInfo拆分FileName和Arguments;File.Exists等支持Unicode但需启用长路径;用户输入路径应避免截断;Path.Combine拼接后建议TrimEndingDirectorySeparator。
路径含空格时 Process.Start 直接失败
Windows 下用 Process.Start 启动带空格路径的程序(比如 "C:\Program Files\MyApp\app.exe")会报错“系统找不到指定的文件”,不是因为路径不存在,而是 Shell 解析时把空格当成分隔符,只取了 C:\Program 这一段。
解决方法是显式加双引号包裹整个路径,但注意:不能手动拼接字符串(容易漏转义或引号嵌套出错),应交由系统处理:
- 用
ProcessStartInfo的FileName只设可执行文件路径(不含参数),Arguments单独传参 - 如果必须拼成一条命令,对路径调用
CommandLineToArgvW不现实,更简单的是用string.Format(@"""{0}""", path)—— 但仅限你完全控制该路径且确认无内部引号 - 推荐做法:统一用
ProcessStartInfo拆分,例如启动记事本打开带空格的文本文件:var psi = new ProcessStartInfo("notepad.exe", @"C:\My Docs\readme.txt");
Process.Start(psi);
File.Exists 和 Directory.GetDirectories 对 Unicode 路径的支持
C# 的 File.Exists、Directory.GetFiles 等 API 默认支持 Unicode 路径(如含中文、emoji、全角空格),但前提是你的程序没有禁用长路径支持,且 Windows 版本 ≥10 1607。
常见陷阱:
- Windows 旧版本默认限制 260 字符路径(
MAX_PATH),超长路径会返回false或抛PathTooLongException,即使路径真实存在 - .NET Core 3.0+ 和 .NET 5+ 默认启用长路径,但 .NET Framework 需在 app.config 中启用:
- 某些第三方库(如旧版
SevenZipSharp)内部仍用 ANSI API,遇到中文路径会静默失败,需查文档或换库
用户输入路径时的空格与截断风险
从 Console.ReadLine()、TextBox.Text 或命令行 args 获取路径时,如果用户没加引号(如输入 C:\Program Files\test.txt),args[0] 实际只拿到 C:\Program。