点文件,例如.htaccess .gitignoreand .config,是否有文件扩展名但没有文件名,或者它们是否被认为有文件名但没有扩展名?
我正在尝试在 PHP 中实现一些实用程序函数,这因做错事情而臭名昭著,我注意到 PHP 的pathinfo函数认为 dotfiles 具有文件扩展名且没有文件名,而 nodepath.extname认为 dotfiles 具有文件名且没有扩展名。
我不清楚是否存在标准,或者这是否符合开发人员的偏好。
点文件,例如.htaccess .gitignoreand .config,是否有文件扩展名但没有文件名,或者它们是否被认为有文件名但没有扩展名?
我正在尝试在 PHP 中实现一些实用程序函数,这因做错事情而臭名昭著,我注意到 PHP 的pathinfo函数认为 dotfiles 具有文件扩展名且没有文件名,而 nodepath.extname认为 dotfiles 具有文件名且没有扩展名。
我不清楚是否存在标准,或者这是否符合开发人员的偏好。
您付了钱,然后选择:是的,不,也许。
这取决于您对“扩展”的定义。
请记住,SCCS 文件使用前缀s.(其中包括;您也会看到p.文件 - 并且有许多带有其他前缀的临时文件名)。SCCS 文件是否s.something有扩展名或前缀?(使用s.source.c,它相当简单;有前缀、名称和扩展名或后缀,或者您可以忽略前缀作为特殊情况,名称是s.source,扩展名是.c。)默认的可执行文件名称a.out呢?诸如..dot;之类的名字怎么样?它有扩展名吗?如果有,它是什么?
请注意,DOS 上的答案更加正式。在那里,文件系统用于(在另一个千年左右)使用 8.3 强制执行名称,并且扩展是有形的。但这在很大程度上是一个过去的时代(很少有人怀念它)。
Anthony Arnold和paxdiablo都注意到以.tar.gz存在结尾的名称——这些文件的扩展名是什么?
如果您将 的扩展名somecode-8.76.tar.gz视为 以外的任何内容.gz,那么您就是在向 bag'o'worms 敞开自己的大门。包含的文件是somecode-8.76.tar;可以合理地说它本身具有 的扩展.tar。将整个 gzip 压缩的 tar 文件的扩展名定义为.tar.gz引发了“为什么不是.76.tar.gz”的问题,也意味着您需要重新访问 SCCS 文件命名约定。.76将名称的一部分吸收到其中之一.76.tar.gz或.76.tar作为后缀确实使生活变得复杂。这是一个有效的问题,但除了“扩展是从最后一个点到名称末尾的字符串”之外的任何问题确实令人担忧——或者需要解释扩展的含义,
请注意,操作系统或文件系统级别的 Unix 并不关心文件的扩展名。程序可以决定他们是否关心扩展,但这取决于程序。扩展名是文件类型的指示符;这不是确定的。这就是file程序存在以识别文件内容的原因。它查看文件的内容以识别内容;它不注意文件扩展名(因此它也不必决定扩展名是什么)。
有人想知道文件扩展名的原因是他想知道文件的类型(或其他一些元数据),对吧?
点文件的名称与其类型无关。点文件的第一个点之后的部分是它的名称,没有扩展名。但是点文件也可以有扩展名(例如.mongorc.js,UNIX 系统上的一些其他隐藏文件)。
所以我想说,节点的path.extname做法是正确的。
从最后一个 '.' 返回路径的扩展名 到路径最后部分的字符串结尾。如果没有'.' 在路径的最后部分或它的第一个字符是'.',然后它返回一个空字符串。
这里有两个不同的东西:
一方面存在通过文件扩展名确定某些元数据的机制,例如在非类 Unix系统中使用“默认”应用程序打开它。
另一方面,点文件只是ls来自
类 unix系统的隐藏文件(具有正常名称和前面的点,以使它们对 不可见)。所以.gitignore只是一个名为gitignore 并标记为隐藏的文件 - 这里没有扩展名。
我觉得我必须留下一个解决用户实际问题的答案。
在这种情况下,您实际上需要扩展什么?.gitignore等文件与.htaccess文件的全名匹配。不是“扩展名”(或缺少),而是全名。
我会争论取消对文件扩展名的任何检查,并检查文件名。例如,在 PHP 中:
basename ("/path/to/.htaccess");
我会说它们只是隐藏的......在 Unix/Linux 中,如果文件/目录的第一个字符是“。”,则认为文件/目录是隐藏的。(点),所以它只是第一个字符 - 不是扩展名/后缀。
此外,目录也可以被隐藏——包括“.”。和“..”(当前和父)目录 - 扩展名/后缀通常不是我们与目录相关联的东西。事实上,许多程序会为自己创建这样的隐藏目录(例如 .foo),而不仅仅是一个文件(例如 .foorc)。
最后,无论如何,Unix/Linux 从来没有那么关心后缀——大多数程序能够读取“他们的”文件而无需中继。相反,Unix 经常使用来自“magic”文件(/etc/magic)的测试和file阻止文件类型的命令。(值得注意的例外是像gzipand之类的压缩程序bzip2,它用后缀压缩版本替换原始版本)。
我要补充一点,“rc”结尾(用于“运行命令”)——例如 .bashrc、.wgetrc、.zshrc 等,可以被认为是这些类型文件的后缀/扩展名——事件虽然名称和后缀之间没有点(有些 - 例如 .rtorrent.rc - 实际上有一个点)。