本文是「CLAD 例题精讲 · 第 20 讲」系列之二。上一批讲过 Build Path 会解析
..,这一题考它的近亲 String to Path:把一段字符串直接转成路径,会发生什么?答案是------它比你想的"轴"得多。
01 题目
NI Daily CLAD 2014-12-03,Windows 系统。程序框图只有三个元素:一个字符串常量,内容是 Steve/Likes/LabVIEW (注意分隔符是正斜杠 /);一个 String to Path 函数;输出 Path Out。
问:Path Out 显示什么?
- a) Steve\Likes\LabVIEW
- b) Steve/Likes/LabVIEW
- c) C:\Steve\Likes\LabVIEW
- d) Steve?Likes?LabVIEW

题面:字符串常量接 String to Path(NI Daily CLAD 2014-12-03)

运行后的 Path Out:问号现身
02 答案
D,Steve?Likes?LabVIEW------斜杠全变成了问号。
03 为什么
String to Path 的规矩只有一条:它不做分隔符转换。
很多人脑子里有个"贴心版"的 String to Path:看到 / 就顺手转成 Windows 的 \。实际它没这个服务。Windows 下 LabVIEW 路径的分隔符是反斜杠 \,正斜杠 / 在路径组件内部 是非法字符------一个路径组件里不允许出现 /。转换时,LabVIEW 不报错、也不转换,而是把每个非法字符替换成问号 ?,每个非法字符对应一个问号。
于是 Steve/Likes/LabVIEW 进去,出来就是 Steve?Likes?LabVIEW:两个斜杠,两个问号,一一对应。
- 选 a) 的,默认了"会帮我转换"------没有这个服务;
- 选 b) 的,把 String to Path 当成原样搬运的类型转换------它要保证产出的是合法路径,原样保留非法字符就做不到;
- 选 c) 的,以为还会补盘符------它不会给相对路径凭空加 C:\。
图1 是题面,图2 是实际运行后 Path Out 的样子,问号清清楚楚。
04 容易栽的坑
坑一:拿字符串拼接的习惯对待路径转换。 连接字符串(Concatenate Strings)确实原样搬运,String to Path 不是。上一批讲过 Build Path 会解析 ..,这一题再补一刀:String to Path 会替换非法字符------路径家族的每个函数都有自己的规矩,都不是字符串操作。
坑二:以为 / 在 Windows 上"其实也是分隔符"。 命令行和很多 API 确实接受 /,但在 LabVIEW 的路径模型里,路径组件中 / 就是非法字符,照样变问号。
坑三:问号不报错。 这是最阴的一处:转换成功、无错误簇、程序继续跑,直到文件操作在某个不存在的地方失败------错误出现在离病灶很远的地方。
05 工程里怎么用
拼路径永远用 Build Path,别用字符串拼完再转。 Build Path 按平台规则加分隔符,天然合法。
从外部拿到的路径先清洗。 Linux 风格路径、URL 里抠出来的片段、日志里复制出来的路径,都带着 /------先做一次字符串替换(/ 换成 \),再进 String to Path,否则就是一串问号。
见到问号,先查来源字符串。 路径指示器里冒出问号,基本可以断定:某个字符串带着非法字符进了 String to Path(或者从网络、配置文件里带进来的),顺着线往回找那个常量就行。
一句话总结:String to Path 不转分隔符,只替换非法字符------/ 进去,? 出来,错误簇还是绿的。