每个操作系统上的文件路径中是否存在任何非法字符?

时间:2014-02-22 13:35:20

标签: windows unix character filepath

是否有任何字符保证不会出现在Windows或Unix / Linux / OS X上的任何文件路径中?

我需要这个,因为我想将几个文件路径连接成一个字符串,然后再将它们分开。

2 个答案:

答案 0 :(得分:2)

在评论中,哈里约翰斯顿写道:

  

此类问题的通用解决方案是在加入文件路径之前对其进行编码。例如,如果您正在处理单字节字符串,则可以将它们转换为十六进制字符串;所以“你好”变成了“68656c6c6f”。 (显然这不是最有效的解决方案!)

这绝对是正确的。 请不要尝试使用文件名和保留字符做任何“棘手”的事情,因为最终会在一些奇怪的角落案件中突破,你的继任者将有一段时间试图修复损坏。

事实上,如果您想要移植,我强烈建议您永远不要尝试创建任何文件名,包括除[a-z0-9_]以外的任何字符。 (考虑到Windows和OS X上的公共文件系统可以在不区分大小写的模式下运行,其中FooBar.txtFOOBAR.TXT是相同的标识符。)

实际使用的体积相当紧凑的编码方案是制作“白名单集”,例如[a-z0-9_],并将“白名单集”之外的任何字符ch编码为printf("_%2x", ch)。因此hello.txt变为hello_2etxthello_world.txt变为hello_5fworld_2etxt。 由于每个_都已转义,因此您可以使用double - _作为分隔符:编码字符串hello_2etxt__goodbye___2e_2e唯一标识文件名列表['hello.txt', 'goodbye', '..']

答案 1 :(得分:1)

如果您愿意,可以使用换行符,特别是CR(十进制代码13)或LF(十进制代码10)。这是否合适取决于您对用户显示连接字符串的要求 - 使用这种方法,它将在不同的行上打印它们的部分 - 这可能是非常好或非常糟糕的目的(或者你可能不在乎......)。

如果您需要在一行上打印连接字符串,请编辑您的问题以指定此附加要求;我们可以从那里出发。