我正在尝试寻找有关这个问题的权威答案,但这很难。维基百科有点回避这个问题,但不够明确。
对于.txt
(举例来说),基本名称是否为空且扩展名为txt
?或者基本名称.txt
(包括句点)和扩展名为空?
那么,类似这样的奇怪的事情怎么办.a.b
?
我意识到操作系统之间可能存在一些差异,因此我感兴趣的是它们是什么以及建议使用的与操作系统无关的“经验法则”是什么。我计划在服务器中为 Web 应用程序编写解析逻辑,因此它需要分析从许多不同操作系统发送的文件名字符串。
答案1
如果您想要与操作系统无关,则不存在“文件扩展名”之类的东西。某些操作系统实际上可能会使用这些来确定要打开文件的程序,甚至会明确限制它们(想想最多 3 个字符的 FAT)。
但信息也可以从神奇数字或其他启发式方法。文件扩展名只是元数据——从操作系统的角度来看,数据存储在哪里并不重要。例如,在 *nix 中,脚本文件包含舍邦在文件顶部。shebang 会告诉您应该使用哪个解释器来运行该文件,例如/bin/bash
或/usr/bin/env ruby
等。
在 *nix 世界中,“基本名称”就是文件名,/
去掉了所有前导部分(即包括最后一个 的路径)。因此, 的基本名称.txt
将是.txt
。 的基本名称/usr/bin/foo
将是foo
。
以点开头的文件称为点文件。除了在类 Unix 操作系统中,默认情况下它们应该从目录列表中隐藏之外,它们没有任何特殊之处。它们的基本名称是它们的全名,因此.bashrc
实际上称为.bashrc
。点文件本身没有扩展名。
因此,如果你想保持与操作系统无关,请尝试获取基本名称(在 *nix 意义上)并存储它。其他任何内容都将总是定义模糊。
您还可以尝试提取扩展名,它将是从找到的最后一个点开始的整个基本名称组件,例如,foo.tar.gz
显然是一个.gz
文件而不是.tar.gz
。只有使用 gzip 解压缩时,它才会变成foo.tar
,然后才能通过 tar 解压。等等。