代码之家  ›  专栏  ›  技术社区  ›  meleyal

目录路径变量应该以尾随斜杠结尾吗?

  •  71
  • meleyal  · 技术社区  · 16 年前

    将目录路径定义为变量或常量时,是否应以尾随斜杠结尾?什么是惯例?

    pwd 在Unix中,显示当前目录,不带尾随斜杠,而选项卡完成 cd /var/www/apps/ 包括尾随斜线,这让我不确定。

    11 回复  |  直到 6 年前
        1
  •  18
  •   Johan Soderberg    16 年前

    例如,当我定义存储文件的目录时,我不包括尾随斜杠。那是因为我会像

    $store_file = "$store_path/$file_id";
    

    在使用应该保存目录路径的变量之前,我将始终添加一个尾随斜杠。我认为最好总是加一个,而不是想知道是否包含了尾随斜杠。

        2
  •  80
  •   Dave Sherohman    16 年前

    我使用斜杠是因为:

    1. “如果以斜杠结尾,则为目录。如果不是,那就是一个文件。”这是一个很容易记住的约定。

    2. 至少在我常用的操作系统上,将斜线加倍不会造成问题,而省略斜线会导致大问题。因此,将斜杠放在变量中并在使用时使用“$path/$file”是最安全的。

        3
  •  9
  •   pauljwilliams    16 年前

    是的,它应该,因为:

    路径名+文件名=完全限定的文件位置。

    所以最后一个目录和文件名之间的斜线应该在路径名的末尾或者文件名的开头。如果只想打开一个文件(即假定当前工作目录中有一个不合格的文件名),那么在文件名前面加上/意味着您需要考虑到这一点。

        4
  •  5
  •   jerryjvl    16 年前

    每当我存储目录路径,或者从API返回它们时,我都会尝试遵守保留尾随斜杠的约定。这样可以避免整个“是文件还是目录”的模糊性。

    补遗 :
    这并不能代替使用可以容忍尾随斜杠或其缺失的方法。即使使用这个约定,我仍然经常使用 Path.Combine(...) 以及类似的方法。

        5
  •  4
  •   Paul F    9 年前

    我知道这是一条古老的线索,但我想我会分享我的所作所为。如果可能的话,我通常会同时考虑这两种情况,并做类似的事情(如果它是php):

    $fullPath = rtrim($directory, '/') . '/filename.txt');
    

    这样,如果目录是在配置文件中定义的,那么下一个更改目录的人是否包含尾随斜杠并不重要。

        6
  •  4
  •   Basil Musa    9 年前

    在PHP中,因为dirname(uu file_uuu)函数返回的目录名末尾没有斜杠。我倾向于坚持那个惯例。

    否则,在目录名末尾使用斜杠将与dirname(..)的工作方式冲突,然后您将无法处理这两种情况,因为您不知道目录名是来自dirname(..)函数还是由尾随斜杠定义的contant。

    底线: 不要使用尾随斜杠,因为dirname(..)没有。

    // PHP Example
    dirname(__FILE__); // returns c:\my\directory without a trailing slash, so stick to it!
    

    对于其他语言,请检查提取路径名的函数,并查看它是否使用了尾随斜杠,然后遵循该语言的约定。

        7
  •  4
  •   DanMan    8 年前

    也许你应该考虑一下你的决定对文件意味着什么。如果不在 目录 名称您必须将其添加到 文件 姓名。

    现在,如果由于某种原因,在连接字符串时缺少指向文件的路径,那么最终会得到如下结果: /filename 它不仅是一个文件,而且是根目录的绝对路径(在该上下文中的任何位置)。

    这就是为什么我用斜杠结束我的路径,并将文件作为文件保存。

        8
  •  3
  •   James    16 年前

    我倾向于添加尾随斜杠,因为我很可能会使用该目录添加/检索文件…

    在Web引用方面,它实际上可以提高性能,而将尾部斜杠留在

    http://www.netmechanic.com/news/vol4/load_no11.htm

        9
  •  2
  •   maxp    16 年前

    是的,有许多文件系统支持没有任何扩展名的文件,所以总是添加尾随斜杠以避免任何问题。

        10
  •  2
  •   Karl Wilbur William Pursell    6 年前

    我知道这是10岁,但我想投入我非常固执己见的0.02美元。

    不,不,绝对不。

    我们讨论的是一个Unix系统。在目录本身的引用中,它和其他节点一样是一个节点。在引用目录时,它的名称中不应该有未转义的斜杠(参考: dirname , pwd , ~ , echo $HOME , echo $PATH ,输出来自 ls ,等)。

    当引用目录的内容时, 然后 你需要一个斜线。这就是说, ls /home/karl/ ls /home/karl (FTR,我几乎总是做后者,因为…嗯,懒惰)。

    当使用包含目录的变量创建文件的完整路径时,您总是希望包含斜杠(即: cp ${HOME}/test ${OTHER_DIR}/ )

    它是 预期 目录不能以斜杠结尾。对目录以斜杠结尾的任何期望都是错误的。因此在 *_DIR 变量的值将颠覆预期。

    值得注意的是,仅仅因为它是错误的,并不意味着工具/包/库永远不会这样做。在不应该存在的情况下,这种情况会添加一个尾随斜杠,这太常见了。因此,作为 Bevan Paul F 两者都建议,在使用第三方工具时,最好删除目录名中可能存在的任何尾随斜杠。

    UNIX节点

    inode(index node)是Unix风格文件系统中的一种数据结构,用于描述文件系统对象,如文件或目录。

    —— https://en.wikipedia.org/wiki/Inode

    文件系统层次结构标准

    这个 Unix文件系统的标准(文件系统层次结构标准,又名fhs)清楚地表明,目录不被认为有一个尾随斜杠,而是目录内容以斜杠开头(唯一的例外是 / 因为我们不会使用空字符串来引用文件系统根目录……而且无论如何都不应该在那里创建文件。)

    —— http://www.pathname.com/fhs/pub/fhs-2.3.html

    —— https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard

        11
  •  1
  •   Bevan    16 年前

    我从来没有见过一个坚定的惯例。

    不过,很肯定的是,无论你决定什么,其他人都会百分之百地肯定这是另一种方式。所以,最好的办法就是容忍任何一种情况发生。

    在.NET世界中,path.combine()为您提供了一种处理这一问题的方法—在其他环境中,从上到下都有类似的命令文件。