文件名? 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的优秀答案。
总结:(斜体是我不会用作程序员的)
-
path :path指定文件系统中的唯一位置(除非其相对path)。 path名称不太常用,但我会坚持path – 这很好解释它是什么。 path可以指向一个文件或文件夹甚至没有(C:\)。 path可以是:
- 相对path :
My Source\Widget\
是相对path以及Widget\foo.src
。 自我解释。 - 绝对path或完整path :是指向目标的完全限定path。 我倾向于更频繁地使用后者。
C:\users\OddThinking\Documents\My Source\Widget\foo.src
因此是完整path。 在最后看到我称为完整path,指向一个文件,并以目录结束。
wiki页面和.NET命名path是一致的。
- 相对path :
-
根path或根目录 :前者是.NET惯例,后者在UNIX界更多。 虽然我喜欢两个我倾向于使用前者更多。 在Windows中,不像UNIX,有许多不同的根path,每个分区一个。 Unix系统有一个根目录,它保存其他目录和文件的信息。 例如。
C:\
是根path。 -
文件夹或文件夹名称 :
Widget
,OddThinking
等你的情况。 这可能是一个Windows的惯例(实际上是我自己奇怪的想法:)),但我坚决反对blinry的答案“目录”。 虽然对于一个普通的用户目录来说意味着像一个文件夹(就像子文件夹,子目录一样),我相信从技术angular度来看“目录”应该听起来像是一个合格的地址,而不是目标本身。 更多下面。- 子文件夹 :对于
users
OddThinking
和Documents
是子文件夹。 -
OddThinking\
:对于users
OddThinking\
,OddThinking\Documents\
和OddThinking\Documents\My Source\Widget\
是子目录。 但是我们不经常需要麻烦,是吗? - 子文件夹 :对于
users
OddThinking
是一个子文件夹(以及子文件夹) - 父文件夹 :对于
OddThinking
users
是其父文件夹(只是提及不同的术语,没有什么大不了的)。
- 子文件夹 :对于
-
目录或目录名称 :前者一般在现实生活中使用,后者在代码中。 这是指完全合格的path(或简单的完整path ),直到目标的父文件夹 。 在你的情况下,
C:\users\OddThinking\Documents\My Source\Widget
(是一个目录永远不会指向一个文件)。 我在我的代码中使用目录名称,因为目录是.NET中的一个类,目录名称是库本身调用它的东西。 它与UNIX系统中使用的dirname非常一致。 -
文件名或基本名称 : 文件的名称和扩展名。 在你的情况:
foo.src
。 我会说,对于非技术性用途,我更喜欢文件名 (这对于最终用户来说意味着什么),但出于技术目的,我会严格遵守基本名称 。 文件名经常被MS使用, 但我很惊讶,不仅在文档中,而且在图书馆中它们不一致 。 有文件名可能意味着文件的基本名称或完整path。 所以我喜欢basename,这就是我在代码中所称的。 维基上的这个页面也表示文件名可能意味着完整path或基本名称。 令人惊讶的是即使在.NET中,我也可以find用法基本名称来表示文件的根名称。 -
扩展 名或文件 名扩展名或文件扩展名 :我喜欢最后一个。 所有的都是指同一个东西,但这又是一个辩论的问题! 维基说,这是
src
而当时我记得许多语言解释为.src
。 注意点。 所以我再一次.src
,对于偶然的使用,它并不重要,但是作为程序员,我总是把扩展名看成.src
。好吧,我可能试图取一些标准的用法,但这是我遵循的两个约定。 这是关于完整的path。
-
我通常调用指向文件path的完整path 。 对我来说文件path是明确的,它告诉我它是什么。 虽然有文件名,我觉得它作为文件的名称,在我的代码中,我把它称为文件名 。 这也与“ 目录名称 ”一致。 从技术方面来说,名字是指完全合格的名字! 令人沮丧的.NET使用术语文件名称(所以我有我的情况在这里),有时为此文件path。
-
我调用一个完整的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 !
-
回答你:
-
关于你给的path
A)不知道。 无论如何,我从来不需要独自一人。
B)基地名称
C)我只是暂时把它称为文件扩展名,我至less担心,因为我从来不需要单独在我的代码中命名。
D)文件扩展名肯定。
E)我不认为这是一个通用的要求。 不知道。 在.NET基本目录是相同的目录名称。
F)相对path
G)文件夹(父文件夹到basename
foo.src
)H)目录名称
我)完整path(甚至文件名)
-
一般来说(抱歉有点冗长,只是推动点),但假设
foo.src
确实是一个文件A)不适用
B)基地名称
C)NA
D)延伸
E)目录或简单的path
F)相对path
G)NA
H)目录或简单的path
我)完整path(甚至文件名)
再举一个例子,从我身边:
-
考虑path
C:\Documents and Settings\All Users\Application Data\s.sql
。-
C:\Documents and Settings\All Users\Application Data\s.sql
是完整path(这是一个文件名) -
C:\Documents and Settings\All Users\Application Data\
是目录名称。
-
-
现在考虑path
C:\Documents and Settings\All Users\Application Data
-
C:\Documents and Settings\All Users\Application Data
是完整的path(恰好是一个目录) -
C:\Documents and Settings\All Users
是目录名称。
-
我的两个秘诀:
-
我遵循这个经验法则,当谈到处理一个完整的地址而不考虑它的types时,我几乎总是把它称为“完整path”。 这不仅消除了文件path和文件夹path的两个术语的使用,而且还避免了将文件命名为文件名(对于大多数用户即时转换为基本名称)的潜在混淆。 但是,如果您必须具体说明path的types,则最好命名文件名或目录,而不是更通用的“path”。
-
不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名称是:)