文件名? path名称? 基地名称? 一个path的命名标准

当我是操纵path和文件名时,我总是让自己陷入困境,因为我没有一个通用的命名系统。

我需要提出一个命名标准并坚持下去,我希望与其他人保持一致和清晰,所以我开放了学习经典的答案。

考虑这个玩具问题:( Windows例子,但希望答案应该是平台独立的)

您已获得文件夹的全名:C:\ users \ OddThinking \ Documents \ My Source。 您想要遍历下面的文件夹,并将所有.src编译为.obj。

在某些时候,你正在看下面的string。

C:\users\OddThinking\Documents\My Source\Widget\foo.src 

那么,您将使用哪些标识符名称作为零件?

 A) foo B) foo.src C) src D) .src E) C:\users\OddThinking\Documents\My Source\ - ie the top of the tree. F) Widget\foo.src - ie the path from the top of the tree to the leaf. G) Widget - ie one node of the tree. H) C:\users\OddThinking\Documents\My Source\Widget\ - ie the name of the folder I) C:\users\OddThinking\Documents\My Source\Widget\foo.src 

让我给一些答案,让你开始。

A)基地名称?

B)文件名? 或者它是文件名? select标识符名称时,区别很重要,我在这里永远不会一致。

C)扩展

D)扩展。 等等,这就是我所说的C.我应该避免存储点,并在需要时放入? 如果某个文件上没有点,怎么办?

H)path名? 或者等一下,这只是路?

我)文件名。 等等,那就是我所谓的C.path。 等等,那就是我所说的。也许H应该是文件夹名称。 虽然,“文件夹”不是Windows专用术语吗?

我认为你对“标准”命名约定的search将是徒劳的。 以下是我基于现有知名计划的build议:

A)C:\ users \ OddThinking \ Documents \ My Source \ Widget \ foo .src

Vim把它称为文件根目录 (:help filename-modifiers)

B)C:\ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

文件名或基本名称

C)C:\ users \ OddThinking \ Documents \ My Source \ Widget \ foo。 src (没有点)

文件/名称扩展名

D)C:\ users \ OddThinking \ Documents \ My Source \ Widget \ foo .src (带圆点)

也是文件扩展名 。 简单地存储没有点,如果文件没有点,它没有扩展名

E) C:\ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

树的顶端
没有约定,git把它称为基础目录

F)C:\ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

从树顶到树叶的path
相对path

G)C:\ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

树的一个节点
没有约定,也许是一个简单的目录

H) C:\ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

目录名称

I) C:\ users \ OddThinking \ Documents \ My Source \ Widget \ foo.src

完整/绝对path

好的问题首先,我的+1。 当我不得不在Utility类中创build一系列函数时,这个东西给我带来了麻烦。 用GetFileName? 或者GetFullName? GetApplicationPath是指完整path还是目录名? 等等。 我来自.NET的背景,所以我认为我可以多加一些@blinry的优秀答案。

总结:(斜体是我不会用作程序员的)

  1. path :path指定文件系统中的唯一位置(除非其相对path)。 path名称不太常用,但我会坚持path – 这很好解释它是什么。 path可以指向一个文件或文件夹甚至没有(C:\)。 path可以是:

    1. 相对pathMy Source\Widget\是相对path以及Widget\foo.src 。 自我解释。
    2. 绝对path完整path :是指向目标的完全限定path。 我倾向于更频繁地使用后者。 C:\users\OddThinking\Documents\My Source\Widget\foo.src因此是完整path。 在最后看到我称为完整path,指向一个文件,并以目录结束。

    wiki页面和.NET命名path是一致的。

  2. 根path根目录 :前者是.NET惯例,后者在UNIX界更多。 虽然我喜欢两个我倾向于使用前者更多。 在Windows中,不像UNIX,有许多不同的根path,每个分区一个。 Unix系统有一个根目录,它保存其他目录和文件的信息。 例如。 C:\是根path。

  3. 文件夹文件夹名称WidgetOddThinking等你的情况。 这可能是一个Windows的惯例(实际上是我自己奇怪的想法:)),但我坚决反对blinry的答案“目录”。 虽然对于一个普通的用户目录来说意味着像一个文件夹(就像子文件夹,子目录一样),我相信从技术angular度来看“目录”应该听起来像是一个合格的地址,而不是目标本身。 更多下面。

    1. 子文件夹 :对于users OddThinkingDocuments是子文件夹。
    2. OddThinking\ :对于users OddThinking\OddThinking\Documents\OddThinking\Documents\My Source\Widget\是子目录。 但是我们不经常需要麻烦,是吗?
    3. 子文件夹 :对于users OddThinking是一个子文件夹(以及子文件夹)
    4. 父文件夹 :对于OddThinking users是其父文件夹(只是提及不同的术语,没有什么大不了的)。
  4. 目录目录名称 :前者一般在现实生活中使用,后者在代码中。 这是指完全合格的path(或简单的完整path ),直到目标的父文件夹 。 在你的情况下, C:\users\OddThinking\Documents\My Source\Widget (是一个目录永远不会指向一个文件)。 我在我的代码中使用目录名称,因为目录是.NET中的一个类,目录名称是库本身调用它的东西。 它与UNIX系统中使用的dirname非常一致。

  5. 文件名或基本名称文件的名称和扩展名。 在你的情况: foo.src 。 我会说,对于非技术性用途,我更喜欢文件名 (这对于最终用户来说意味着什么),但出于技术目的,我会严格遵守基本名称 。 文件名经常被MS使用, 但我很惊讶,不仅在文档中,而且在图书馆中它们不一致 。 有文件名可能意味着文件的基本名称或完整path。 所以我喜欢basename,这就是我在代码中所称的。 维基上的这个页面也表示文件名可能意味着完整path或基本名称。 令人惊讶的是即使在.NET中,我也可以find用法基本名称来表示文件的根名称。

  6. 扩展 文件 名扩展名文件扩展名 :我喜欢最后一个。 所有的都是指同一个东西,但这又是一个辩论的问题! 维基说,这是src而当时我记得许多语言解释为.src 。 注意点。 所以我再一次.src ,对于偶然的使用,它并不重要,但是作为程序员,我总是把扩展名看成.src

    好吧,我可能试图取一些标准的用法,但这是我遵循的两个约定。 这是关于完整的path。

    1. 我通常调用指向文件path的完整path 。 对我来说文件path是明确的,它告诉我它是什么。 虽然有文件名,我觉得它作为文件的名称,在我的代码中,我把它称为文件名 。 这也与“ 目录名称 ”一致。 从技术方面来说,名字是指完全合格的名字! 令人沮丧的.NET使用术语文件名称(所以我有我的情况在这里),有时为此文件path。

    2. 我调用一个完整的path作为一个目录的目录结束。 实际上,可以调用任何不指向文件目录的地址。 所以C:\users\OddThinking\Documents\My Source\是一个目录, C:\users\OddThinking\是一个目录,甚至是OddThinking\Documents\My Source\ (最好称之为子目录甚至更好的相对path -所有这一切取决于你正在处理的情况)。 上面我提到了一些与目录名称不同的目录。 这是我的承诺:我会find一条新路,以避免混淆。 这是什么D:\Fruit\Apple\Pip\ ? 一个目录。 但是如果问题是D:\Fruit\Apple\Pip\的目录甚至是更好的目录名称,答案是D:\Fruit\Apple\ 。 希望它清楚。

    我会说最好不要担心最后两个术语,因为这是造成最大的混乱(对我个人而言)。 只需使用术语全path

回答你:

  1. 关于你给的path

    A)不知道。 无论如何,我从来不需要独自一人。

    B)基地名称

    C)我只是暂时把它称为文件扩展名,我至less担心,因为我从来不需要单独在我的代码中命名。

    D)文件扩展名肯定。

    E)我不认为这是一个通用的要求。 不知道。 在.NET基本目录是相同的目录名称。

    F)相对path

    G)文件夹(父文件夹到basename foo.src

    H)目录名称

    我)完整path(甚至文件名)

  2. 一般来说(抱歉有点冗长,只是推动点),但假设foo.src确实是一个文件

    A)不适用

    B)基地名称

    C)NA

    D)延伸

    E)目录或简单的path

    F)相对path

    G)NA

    H)目录或简单的path

    我)完整path(甚至文件名)

再举一个例子,从我身边:

  1. 考虑pathC:\Documents and Settings\All Users\Application Data\s.sql

    1. C:\Documents and Settings\All Users\Application Data\s.sql是完整path(这是一个文件名)
    2. C:\Documents and Settings\All Users\Application Data\是目录名称。
  2. 现在考虑pathC:\Documents and Settings\All Users\Application Data

    1. C:\Documents and Settings\All Users\Application Data是完整的path(恰好是一个目录)
    2. C:\Documents and Settings\All Users是目录名称。

我的两个秘诀:

  1. 我遵循这个经验法则,当谈到处理一个完整的地址而不考虑它的types时,我几乎总是把它称为“完整path”。 这不仅消除了文件path和文件夹path的两个术语的使用,而且还避免了将文件命名为文件名(对于大多数用户即时转换为基本名称)的潜在混淆。 但是,如果您必须具体说明path的types,则最好命名文件名或目录,而不是更通用的“path”。

  2. 不pipe是什么,你都会有自己的想法,始终与它保持一致。 团队成员之间有一个共识,这意味着这一点,而不是。

现在刚刚从这个圈子我有一些练习。 一个新的术语品牌将是OS X和Android机器上使用的。 所有这些都只是文件系统中的物理path。 在url的情况下会出现一套全新的术语。 我希望有人填补这个相同的线程中的空白:)我会很高兴听到你已经前进的惯例..

在C ++中, Boost.Filesystem为path的各个部分devise了一个命名法。 有关详细信息以及本教程 ,请参阅path分解参考文档。

这里是基于教程的总结。 对于:

  • Windowspath: c:\foo\bar\baa.txt
  • Unixpath: /foo/bar/baa.txt

你得到:

 Part Windows Posix -------------- --------------- --------------- Root name c: <empty> Root directory \ / Root path c:\ / Relative path foo\bar\baa.txt foo/bar/baa.txt Parent path c:\foo\bar /foo/bar Filename baa.txt baa.txt Stem baa baa Extension .txt .txt 

C ++标准ISO / IEC 14882:2017

另外Boost.Filesystem的术语已被C ++ 17采用=>参见std::filesystem

 Function name Meaning ---------------- ------------------------------- root_name() Root-name of the path root_directory() Root directory of the path root_path() Root path of the path relative_path() Path relative to the root path parent_path() Path of the parent path filename() Path without base directory (basename) stem() Filename without extension extension() Component after last dot 

在Windows系统中,有时包含该文件目录称为path ,这是从一开始就是如何。 所以,例如,

 d:\dir1\dir2\myfile.txt 

被理解为:

 PATH = "d:\dir1\dir2" FILE = "myfile.txt" 

Unix / Linux方法更合乎逻辑,这就是大家上面提到的:完整path,包括文件名本身。 但是,如果您input“call /?” 在Windows命令行中,您会看到:

  %~1 - expands %1 removing any surrounding quotes (") %~f1 - expands %1 to a fully qualified path name %~d1 - expands %1 to a drive letter only %~p1 - expands %1 to a path only %~n1 - expands %1 to a file name only %~x1 - expands %1 to a file extension only 

那么它就是“仅path”和“仅文件名”。 同时,他们将整个string称为“完全合格的path名”,它被理解为驱动器号加上path加文件名。

我只是说这个让大家不要因为这个话题的混乱而自责。 没关系。 你不疯了 path名称是:)