在文件名中不使用空格字符有哪些技术原因?


75

我认识的某人今天对某些人表示不满,他们倾向于不使用文件名中的空格,例如NamingThingsLikeThis.txt-尽管大多数现代操作系统都支持文件名中的空格。

是否有技术上的原因使文件名没有(适当的)空格仍然很常见?如果是这样,请避免或不鼓励使用文件名中的空格的这些技术原因是什么,它们在什么情况下相关?

我能想到的最明显的原因,以及为什么我通常避免使用它,是处理此类文件时命令行上需要的额外引号。还有其他重要的技术原因吗?


就像您说的那样,在命令行上处理它们要容易得多。对于编程,我不确定是否可以在文件名中使用空格。
Alvin Row

Answers:


65

在命令行和脚本中的许多情况下,文件名中的空格字符在谚语中可能是正确的皇家之痛,在脚本中,您必须要小心以确保正确地转义了它们,因此看起来不像是命令的分隔符运行。

即使您确定在这种情况下永远不会使用文件/目录/任何内容,也不要在其中放置它们,这是更安全的做法。

那样,旧习惯很难消亡。


它们也是正确的皇家痛苦,因此您必须编写路径并对其进行修改。在重新转义/重新引用之前,请确保未对组件进行引用和转义,以进行修改,尤其是如果将片段发送给要操纵的其他代码位时,尤其如此。
afrazier 2011年

2
如果您认为空格不好,请尝试使用'\n'名称中带有换行符()的文件。(类似Unix的系统实际上允许这样做;通常是Windows,或者至少使它变得困难。)
Keith Thompson

30

除了关于命令行和旧习惯的其他答案外,还有许多网络协议在处理包含空格的文件名时需要特别注意。

(如果您曾经尝试从网站上下载“ Product List.pdf”,而最终得到一个名为“ Product”的文件,则会被这个问题所困扰,因为另一端的程序员不知道或无法不能弄清楚http Content-Disposition标头的引用规则。)


11
+1。HTTP作为开始。URL中的空格(对于任何协议,而不仅仅是HTTP)应转义为%20或+。如果未按应有的方式对它们进行编码,则会引起混乱。对于网页,有一个视觉上的原因要避免同时使用空格和下划线(_)代替它们-在带下划线的链接中它们看起来都一样,因此有人手动复制该链接或将其读取给某人可能会错了。
David Spillett

5
有关需要在URL中进行编码的空格的最烦人的事情之一就是某些软件趋向于最终保留对空格进行编码的趋势
SamB 2010年

这是真的吗?在2018年会发生什么?
克里斯·卡洛

@ChrisCalo您可能会注意到,这个答案是在2009年给出的,而不是在2018年给出的。但是,是的,这种情况在2018年仍然会发生。现在,大多数菜鸟开发人员都使用框架来构建网站,而不是从头开始做所有事情,但这种情况可能更少一个问题。
Stobor

28

许多原因都是历史原因。这并不意味着它们今天没有意义。

便携性问题

在命名文件时,您可能还必须考虑其他(文件)系统如何处理该文件名。文件名中的字符可能适合您的系统,但对于另一个系统可能是一个问题。

因此,只要极有可能您希望能够从较早的系统轻松访问文件,就只能选择安全字符。这可能包括引导进入您保留的旧恢复系统,或者担心最新的Windows版本仍然以某种方式基于MS-DOS。

长度

文件系统可能会限制文件的长度。在MS-DOS被限制为8.3文件名的日子里,这甚至更加严重。因此,通过保留空格,您可以在名称中添加更多有意义的字符。

其他几个文件系统也对文件名长度定义了严格的限制。维基百科在有关文件系统比较文章中提供了一个表格,供需要详细信息的人使用。

保留字符

MS-DOS还将空格字符定义为保留字符。这是由于在FAT中使用了空格字符这一事实。此外,MS-DOS在外壳程序中未提供转义系统。

命令行解释

我知道的大多数命令行都使用空格字符作为参数定界符。如果忽略正确地转义文件名,则可能会产生可怕的后果,因为文件名的某些部分可以解释为要调用的应用程序的参数。

考虑一下之间的区别

rm foo bar

rm "foo bar"

上面链接的WikiPedia文章甚至指出由于缺少适当地转义命令而引起的歧义:

可以通过首先禁止在文件名和目录名中嵌入空格(例如,用下划线“ _”代替)来防止歧义,或者在命令行解释器和使用这些参数作为参数的程序的支持下避免歧义引数,可以将名称括在引号字符之间,或在引号字符前使用转义字符,通常使用反斜杠('\')。例如

Long path/Long program name Parameter one Parameter two ...

模棱两可(“程序名称”是程序名称的一部分,还是两个参数?);然而

Long_path/Long_program_name Parameter_one Parameter_two ...,
LongPath/LongProgramName ParameterOne ParameterTwo ...,
"Long path/Long program name" "Parameter one" "Parameter two" ...

和Long \ path / Long \ program \ name Parameter \一个Parameter \两个...

不am昧。

统一资源定位符(URL)

尝试使用URL描述文件的位置时,需要转义空格。

出于多种原因,字符可能是不安全的。空格字符是不安全的,因为在对URL进行转录或排版或对文字处理程序进行处理时,可能会消失大量空格并且可能会引入无关紧要的空格。

来源:RFC1738

因此,必须用a %20代替空格。这使得URL的文件名部分不那么可读,因此人们一开始就避免使用它。


25

空间%20在网络上以文件名编码或转换为文件名,这可能会使管理站点资产变得更加困难。

Image 1.pngImage%201.png令人困惑。Image001.png相反,它更易于使用。

这实际上与命令行的转义序列属于同一类别。


5

有时,在命令行上处理,使用较旧的OS或编写要在不同OS上编译的程序时,或者当...出于很多原因可能出现问题时,空格可能会带来问题。确实感觉写这样的文件很麻烦:file-without-blanks.txtfile_without_blanks.txt。我比较喜欢使用dask,因为在处理带下划线的字体时,下划线有时会变得不可见。

但大多数情况下,这是从老年起就习惯的问题。我认为没有足够的专业理由要放弃。


附加说明,可能不相关,不过我还是将其放在此处。用空格命名文件的人通常不会考虑太多。那些不太了解为什么最好不要使用文件名的人。
而且,我们都可以同意,没有什么比这文件名为“尊敬的先生或女士,我正在写这封信通知您yo.doc”更糟糕的了。

不只是空格-文件长度也很重要,恕我直言,它的长度不能超过30个字符。对于带有空格的长文件名,在刻录CD,DVD等文件时也很幸运,这些文件需要在较旧的OS以及Win和* nix平台之间读取。


2
懒字用户...
SamB 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.