路径组件的命名标准是啥?
Posted
技术标签:
【中文标题】路径组件的命名标准是啥?【英文标题】:What is the naming standard for path components?路径组件的命名标准是什么? 【发布时间】:2011-01-15 03:56:30 【问题描述】:我在处理路径和文件名时总是陷入困境,因为我没有遵循路径组件的命名标准。
考虑以下玩具问题(Windows 示例,但希望答案应该与平台无关)。您已获得文件夹的路径:
C:\users\OddThinking\Documents\My Source\
您想遍历下面的文件夹并将所有 .src 文件编译为 .obj 文件。
在某些时候,您正在查看以下路径:
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\ (i.e. the absolute path of the root)
F. Widget\foo.src (i.e. the relative path of the file)
G. Widget\
H. C:\users\OddThinking\Documents\My Source\Widget\
I. C:\users\OddThinking\Documents\My Source\Widget\foo.src
这是我的尝试:
A.基地名称?基名?
B.文件名?文件名?选择标识符名称时,区别很重要,我在这里从不保持一致。
C.扩展?
D.延期?等等,这就是我所说的 C。我是否应该避免存储点,并在需要时将其放入?如果特定文件上没有点怎么办?
E. ?
F。 ?
G.文件夹?但这不是 Windows 特有的术语吗?
H.路径名?路径名?路径?
我。文件名?等等,这就是我所说的 C. 路径名?等等,这就是我所说的H。
【问题讨论】:
微软技术编辑 Mike Pope 在他的blog that 中指出,虽然微软风格指南始终坚持两个词:文件名、文件夹名称、卷名,但有时苹果风格指南加入它们:文件名、路径名、卷名。 A) 绝对不应称为 basename,因为 basename 已在许多地方用于表示路径中的最后一项(对于文件,这将是没有 dirpath 的文件名)。有些地方称文件名不带扩展名stem
。
另外,对于具有多个句点的文件(例如 foo.src.txt),是否有任何标准方法来识别(和命名)扩展名/s?
【参考方案1】:
我认为您对“标准”命名约定的搜索将是徒劳的。以下是我根据现有的知名计划提出的建议:
A) C:\users\OddThinking\Documents\My Source\Widget\foo.src
Vim 称之为 文件根 (:help filename-modifiers)
B) C:\users\OddThinking\Documents\My Source\Widget\foo.src
file name or base name
C) C:\users\OddThinking\Documents\My Source\Widget\foo.src (不带点)
file/name extension
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
从树顶到叶子的路径 相对路径
G) C:\users\OddThinking\Documents\My Source\Widget\foo.src
树的一个节点 没有约定,可能是一个简单的目录
H) C:\users\OddThinking\Documents\My Source\Widget\foo.src
dir name
I) C:\users\OddThinking\Documents\My Source\Widget\foo.src
full/absolute path
【讨论】:
这有点离题了,但要小心与点分开存储扩展名。您需要处理“foo”、“foo”的文件名。和“foo.txt”(甚至“foo.txt.bak”。) 大家好,很好的例子。如果您将答案放在问题旁边,而不是使用强制向上滚动的引用,则阅读起来会更容易。顺便说一下,我进行了编辑以改进它。问候 维克多,因为你的编辑被拒绝了(wtf 伙计们,这是一个非常好的改进!)我只是自己做的 :-) 对于1.
(仅文件名没有扩展名),由于缺乏明确的约定或至少是全球共识,我很久以前就决定使用File Title
。
对于A
(没有扩展名的文件名),您可以使用stem
。参考文献:doc.rust-lang.org/std/path/struct.Path.html#method.file_stem、llvm.org/docs/doxygen/html/…、boost.org/doc/libs/1_60_0/libs/filesystem/doc/…【参考方案2】:
首先是好问题,我的 +1。当我不得不在 Utility 类中创建大量函数时,这件事困扰着我。获取文件名?或GetFullName? GetApplicationPath 是指完整路径还是目录名?等等。我来自 .NET 背景,所以我想我可以为 @blinry 的其他出色答案添加更多内容。
总结:(斜体字是我作为程序员不会使用的)
路径:路径指定文件系统中的唯一位置(除非它的相对路径)。路径名称不太常用,但我会坚持使用路径 - 它几乎解释了它是什么。路径可以指向文件或文件夹,甚至什么都没有(C:\)。路径可以是:
-
相对路径:
My Source\Widget\
是相对路径,Widget\foo.src
。不言自明。
绝对路径或完整路径:是指向目标的完全限定路径。我倾向于更频繁地使用后者。 C:\users\OddThinking\Documents\My Source\Widget\foo.src
因此是完整路径。最后看看我称之为指向文件并以目录结尾的完整路径。
path 的wiki page 和 .NET 命名是一致的。
Root Path 或 Root Directory:前者是 .NET 约定,而后者在 UNIX 圈子中更常见。虽然我喜欢两者,但我倾向于更多地使用前者。在 Windows 中,与 UNIX 不同,它有许多不同的根路径,每个分区都有一个。 Unix 系统有一个根目录,其中包含有关其他目录和文件的信息。例如。 C:\
是根路径。
文件夹或文件夹名称:Widget
、OddThinking
等在您的情况下。这可能是一个仅限 Windows 的约定(实际上是我自己的奇怪想法:)),但我强烈反对 blinry 的回答“目录”。虽然对于普通用户目录意味着 the same 作为文件夹(如子文件夹、子目录),但我相信从技术角度来看,“目录”应该听起来像是目标的限定地址,而不是目标本身。更多内容如下。
-
子文件夹:相对于
users
OddThinking
和Documents
是子文件夹。
子目录:对于users
OddThinking\
,OddThinking\Documents\
和OddThinking\Documents\My Source\Widget\
是子目录。但我们并不经常需要为此烦恼,不是吗?
子文件夹:对于users
OddThinking
是子文件夹(以及子文件夹)
父文件夹:对于OddThinking
users
是它的父文件夹(只是提到不同的术语,没什么大不了的)。
目录或目录名称:前者一般在现实生活中使用,后者用于代码。这是指直到目标的父文件夹的完全限定路径(或简称为完整路径)。在您的情况下,C:\users\OddThinking\Documents\My Source\Widget
(是的,目录永远不会指向文件)。我在代码中使用目录名称,因为目录是 .NET 中的一个类,而目录名称是库本身所称的。它与 UNIX 系统中使用的dirname 非常一致。
文件名或Basename:文件名和扩展名。在您的情况下:foo.src
。我想说,对于非技术用途,我更喜欢文件名(这对最终用户意味着什么),但出于技术目的,我会严格使用basename。 MS 经常使用文件名,但令我惊讶的是,它们不仅在文档中甚至在库中都不一致。文件名可能意味着文件的基本名称或完整路径。所以我喜欢basename,这就是我在代码中所说的。 wiki 上的This page 也表示文件名可能表示完整路径或基本名称。令人惊讶的是,即使在 .NET 中,我也可以找到用法 basename 来表示文件的根名称。
扩展名或文件扩展名或文件扩展名:我喜欢最后一个。所有都指的是同一件事,但它是什么又是一个争论的问题! Wiki 说是src
,而当时我记得读过许多语言将其解释为.src
。注意点。因此,我再次认为,对于临时用途,它是什么并不重要,但作为一名程序员,我总是将扩展名视为.src
。
好的,我可能已经尝试获取一些标准用法,但这是我遵循的两个约定。它是关于完整路径的。
我通常将指向文件的完整路径称为文件路径。对我来说,文件路径很清晰,它告诉我它是什么。虽然使用文件名我发现它是文件名,但在我的代码中我称之为文件名。也与“目录名”一致。从技术方面来说,name 指的是完全限定的名称!令人沮丧的是 .NET 使用术语文件名(所以我在这里有我的情况),有时使用文件路径。
我称以目录结尾的完整路径为目录。事实上,可以将任何不指向文件的地址称为目录。所以C:\users\OddThinking\Documents\My Source\
是一个目录,C:\users\OddThinking\
是一个目录,甚至是OddThinking\Documents\My Source\
(最好称它为子目录,甚至更好的相对路径——这一切都取决于你处理它的上下文)。好吧,上面我提到了关于目录的不同之处,即目录名称。这是我的看法:我将找到一条避免混淆的新途径。这是什么D:\Fruit\Apple\Pip\
?一个目录。但如果问题是D:\Fruit\Apple\Pip\
的目录或更好的目录名称,答案是D:\Fruit\Apple\
。希望清楚。
我会说最好不要担心最后两个术语,因为这会造成最大的混乱(对我个人而言)。只需使用术语完整路径!
回答你:
关于你给出的路径
A) 不知道。无论如何,我从来不需要单独得到那个。
B) 基本名称
C) 我暂时只称它为文件扩展名,我最不担心,因为我从来不需要在我的代码中单独命名它。
D) 肯定是文件扩展名。
E) 我认为这不是通用要求。不知道。在 .NET 中的基本目录与目录名称相同。
F) 相对路径
G) 文件夹(父文件夹到基本名称foo.src
)
H) 目录名
I) 完整路径(甚至是文件名)
一般来说(抱歉有点冗长,只是为了说明问题),但假设 foo.src
确实是一个文件
A) 不适用
B) 基本名称
C) 不适用
D) 扩展
E) 目录或简单的路径
F) 相对路径
G) 不适用
H) 目录或简单的路径
I) 完整路径(甚至是文件名)
以我身边的一个例子进一步驾驶:
考虑路径C:\Documents and Settings\All Users\Application Data\s.sql
。
C:\Documents and Settings\All Users\Application Data\s.sql
是完整路径(即文件名)
C:\Documents and Settings\All Users\Application Data\
是目录名。
现在考虑路径C:\Documents and Settings\All Users\Application Data
C:\Documents and Settings\All Users\Application Data
是完整路径(恰好是一个目录)
C:\Documents and Settings\All Users
是目录名。
我的两个提示:
我遵循这条经验法则,即无论其类型如何,在寻址完整地址时,我几乎总是将其称为“完整路径”。这不仅消除了对文件路径和文件夹路径的两个术语的使用,而且还避免了如果您将文件命名为文件名(对于大多数用户来说,它立即转换为基本名称)可能会造成混淆。但是是的,如果您必须具体说明路径的类型,最好先命名文件名或目录,而不是更通用的“路径”。
无论是什么,你都会有自己的想法,始终保持一致。在团队成员之间达成共识,这意味着这个而不是那个。
现在,我只是从圈子开始练习。一个新品牌的术语将是 OS X 和 android 机器上使用的术语。所有这些都只是文件系统中的物理路径。在网址的情况下会出现一套全新的术语。我希望有人能在同一个线程中填补空白 :) 我很高兴听到你所遵循的约定..
【讨论】:
长期以来,我一直使用“路径名”这个词来表示包括完整文件名在内的整个绝对路径。您的回答、此处的其他人以及其他地方的资源已经改变了我对此的看法,现在我将使用“完整路径”一词,“路径”表示没有文件名的位置,“文件名”或“名称”表示文件名本身。【参考方案3】:在 C++ 中,Boost.Filesystem 为路径的各个部分设计了一个命名法。有关详细信息,请参阅 path decomposition 参考文档,以及此 tutorial。
这是基于教程的摘要。对于:
Windows 路径:c:\foo\bar\baa.txt
Unix 路径:/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
【讨论】:
那么他们怎么称呼整个事情呢?path
, fullpath
?
@wisbucky 在他们的命名法中,整个事物被称为“路径”。
@wisbucky 修复了链接。谢谢。
@olibre:感谢 C++17 更新。但是stem()
是 filename 的一部分,而不是 path。
@johnc.j。太糟糕了 Boost.Filesystem 在第一次提出问题时并不为人所知。我宁愿采用经过同行评审的图书馆的命名法,也不愿自己编造一些东西。【参考方案4】:
Python 中的Pathlib standard library 对路径组件有一个简单的命名约定:
A. /x/y/z/foo.tar.gz > stem
.
B. /x/y/z/foo.tar.gz > name
.
C. /x/y/z/foo.tar.gz(不包括点)> N/A.
D. /x/y/z/foo.tar.gz(包括点)>suffix
.
E. /x/y/z/foo.tar.gz > grand parent path
.
F。 /x/y/z/foo.tar.gz > relative path to grand parent path
.
G. /x/y/z/foo.tar.gz > parent name
.
H. /x/y/z/foo.tar.gz > parent path
.
我。 /x/y/z/foo.tar.gz > path
.
【讨论】:
我想采用这个但是suffix
而不是extension
,这是从哪里来的? Hust 看起来很不直观。
Th 文档说“PurePath.suffix 最终组件的文件扩展名,如果有的话:”我可以说我想称它为shortyendthing
,也称它为同义词。 Path.extension
不存在。我明白它的用途,我不明白他们为什么要为现有概念取一个新名称。【参考方案5】:
不,你没疯。
在 Windows 系统中,有时 包含文件的目录的路径 称为 path,从一开始就是这样。所以,例如,
x:\dir1\dir2\myfile.txt
Windows:
--------
PATH: x:\dir1\dir2
FILE: myfile.txt
Unix/Linux:
-----------
PATH: /dir1/dir2/myfile.txt
FILE: myfile.txt
Unix/Linux 的方法更合乎逻辑,这就是上面每个人都提到的:路径包括文件名本身。但是,如果您键入“呼叫/?”在 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
就是这样,“仅路径”和“仅文件名”。同时,他们将整个字符串称为“完全限定路径名”,即盘符加路径加文件名。所以没有真正的真相。这是徒劳的。你被背叛了。
不管怎样,
回答你的问题
这就是我给你的例子命名的方式:
A: -
B: basename
C: extension
D: -
E: -
F: -
G: -
H: pathname (or dirname or containing path)
I: full name
A-D-E-F 没有简单的昵称。而且由于 php 可能是最广为人知的跨平台语言,每个人都理解“basename”和“dirname”,所以我会坚持使用这个命名。全名也很明显;完整路径会有点模棱两可,但大多数时候它的意思是一样的。
【讨论】:
长期以来,我一直使用“路径名”这个词来表示包括完整文件名在内的整个绝对路径。这里的其他答案和其他地方的资源已经改变了我的想法,现在我将使用“完整路径”这个词,“路径”表示没有文件名的位置,“文件名”或“名称”表示文件名本身。 【参考方案6】:经过 10 年的黑客攻击,我的两便士是:
保持一致 考虑递归Windows 机器上的示例:
File separator: \
Line separator:
Base name: file
Extension: txt
Filename: file.txt
Drive name: C
Root name: C: (empty on linux)
Root dir: \
Root path: C:\
Base dir: Source\
Base path: C:\Source\
Sub dir: project\
Sub-sub dir: docs\
Relative dir: project\docs\
Relative path: project\docs\file.txt
Working dir: C:\Source\project\docs\
Full path: C:\Source\project\docs\file.txt (also 'Absolute path' or 'File path')
Linux drive dir: C\
Linux root path: \C\
Linux base path: \C\Source\
Parent dir: ..\
Current dir: .\
底部附近的 linux 内容是 bash 如何在 Windows 系统上安装驱动器。
当前目录或工作“目录”实际上是您的程序所在的位置,但让我们使用它来跟踪我们正在处理的当前文件的位置。在powershell中输入pwd
,结果称为路径!
目录总是以文件分隔符结尾并且从不包含文件名。它们可以很容易地附加。 “目录名”可以引用任意位置的任意目录(dirName + sep = dir)。
路径包括根目录、文件名或两者。
也就是说,路径可以通过将根、文件名或两者添加到目录来形成。(您可以区分 paths 和 file路径,然后“相对路径”将排除文件名,但将目录从基本目录提供给工作目录,尽管该术语变得多余,因为它被正确称为相对目录)。
注意关键字的不同含义:
姓名 目录 路径 分隔符然后将它们与完整路径的部分结合起来:
根 基础 相对 文件示例:根路径 = 根名称 + 根目录
注意这对 Windows 和 Linux 是如何工作的(根路径与根目录相同,因为根名称为空)。
在 Java 中,输出由以下方式产生:
package io;
import java.io.File;
import java.util.logging.Logger;
/**
* Directory, File, and Path conventions.
*
* Directories always end with the file separator and never include the filename. They can easily be appended.
* - "Directory name" could refer to any directory in any position (dirName + sep = dir).
*
* Paths include the root, the filename, or both.
*
* <em>On Windows, base directory names can be capitalised.</em>
*/
public class Main
private static Logger logger = Logger.getLogger("io");
public static void main(String[] args)
final String sep = File.separator;
final String lf = System.lineSeparator();
logger.info("File separator: " + sep);
logger.info("Line separator: " + lf);
String baseName = "file";
String ext = "txt";
String fileName = baseName + "." + ext;
String driveName = "C";
String rootName = driveName + ":";
String rootDir = sep;
String rootPath = rootName + rootDir;
String baseDir = "Source" + sep;
String basePath = rootPath + baseDir;
String subDir = "project" + sep;
String subSubDir = "docs" + sep;
String relDir = subDir + subSubDir;
String relPath = relDir + fileName;
String workDir = basePath + relDir;
String fullPath = basePath + relPath;
logger.info("Base name: " + baseName);
logger.info("Extension: " + ext);
logger.info("Filename: " + fileName);
logger.info(lf);
logger.info("Drive name: " + driveName);
logger.info("Root name: " + rootName + " (empty on linux)");
logger.info("Root dir: " + rootDir);
logger.info("Root path: " + rootPath);
logger.info(lf);
logger.info("Base dir: " + baseDir);
logger.info("Base path: " + basePath);
logger.info("Sub dir: " + subDir);
logger.info("Sub-sub dir: " + subSubDir);
logger.info("Relative dir: " + relDir);
logger.info(lf);
logger.info("Relative path: " + relPath);
logger.info("Working dir: " + workDir);
logger.info("Full path: " + fullPath + " (also 'Absolute path' or 'File path')");
logger.info(lf);
String linuxDriveDir = driveName + sep;
String linuxRootPath = rootDir + linuxDriveDir;
String linuxBasePath = linuxRootPath + baseDir;
logger.info("Linux drive dir: " + linuxDriveDir);
logger.info("Linux root path: " + linuxRootPath);
logger.info("Linux base path: " + linuxBasePath);
logger.info(lf);
String parentDir = ".." + sep;
String currDir = "." + sep;
logger.info("Parent dir: " + parentDir);
logger.info("Current dir: " + currDir);
回答OP的问题:
A) foo = base name
B) foo.src = file name
C) src = extension
D) .src = ? (file extension separator + extension)
E) C:\users\OddThinking\Documents\My Source\ = base path
F) Widget\foo.src = relative (file) path
G) Widget = directory name
H) C:\users\OddThinking\Documents\My Source\Widget\ = working path aka "working directory"
I) C:\users\OddThinking\Documents\My Source\Widget\foo.src = full path, absolute path, file path
【讨论】:
【参考方案7】:您可以为简单项目采用的简单答案:
| name | example |
|-------|------------------|
| path | /foo/bar/baa.txt |
| dir | /foo/bar/ |
| file | baa.txt |
| stem | baa |
| ext | .txt |
| parent| /foo/bar/ | (useful for parent dirs)
【讨论】:
我建议删除目录的前导斜杠,以便可以附加它们。【参考方案8】:foo
无扩展名的文件名
foo.src
文件名
src
分机
.src
也许是带点的扩展,但这不应该使用。正如所写,这可以是目录名或文件名。
C:\users\OddThinking\Documents\My Source\
[绝对] 目录路径
Widget\foo.src
相对文件路径
Widget
目录名称
C:\users\OddThinking\Documents\My Source\Widget\
这仍然是一个绝对目录路径。如果一个是 root 而另一个不是,则取决于您的变量名称来跟踪它,那里并没有真正的语义差异。
C:\users\OddThinking\Documents\My Source\Widget\foo.src
[绝对] 文件路径
“文件名”是一个单词,所以一般我们应该使用“文件名”而不是“文件名”(并且文件名不是文件名)。
“目录”一词可以替换为“文件夹”一词。 (也许我们应该在较低级别使用“目录”,但我更喜欢“文件夹”更短。)
实际上可以创建所有这些类型的语义框架,并使用语义上有效的函数来组合它们。例如,FolderName
和Filename
可以组合得到RelativeFilePath
。 FolderPath
(隐含绝对值)和RelativeFilePath
可以组合得到FilePath
(隐含绝对值)。
此外,其中一些是相关的;例如FilenameWithoutExtension
是Filename
的一种,所以应该是可转换的。 FolderName
是 RelativeFolderPath
,所以应该是可转换的。等等。
【讨论】:
以上是关于路径组件的命名标准是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 emacs lisp 中将多个路径组件加入到单个完整路径中的正确方法是啥?