路径组件的命名标准是啥?

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 PathRoot Directory:前者是 .NET 约定,而后者在 UNIX 圈子中更常见。虽然我喜欢两者,但我倾向于更多地使用前者。在 Windows 中,与 UNIX 不同,它有许多不同的根路径,每个分区都有一个。 Unix 系统有一个根目录,其中包含有关其他目录和文件的信息。例如。 C:\ 是根路径。

    文件夹文件夹名称WidgetOddThinking 等在您的情况下。这可能是一个仅限 Windows 的约定(实际上是我自己的奇怪想法:)),但我强烈反对 blinry 的回答“目录”。虽然对于普通用户目录意味着 the same 作为文件夹(如子文件夹、子目录),但我相信从技术角度来看,“目录”应该听起来像是目标的限定地址,而不是目标本身。更多内容如下。

      子文件夹:相对于users OddThinkingDocuments 是子文件夹。 子目录:对于usersOddThinking\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)。

路径包括根目录、文件名或两者。

也就是说,路径可以通过将根、文件名或两者添加到目录来形成。(您可以区分 pathsfile路径,然后“相对路径”将排除文件名,但将目录从基本目录提供给工作目录,尽管该术语变得多余,因为它被正确称为相对目录)。

注意关键字的不同含义:

姓名 目录 路径 分隔符

然后将它们与完整路径的部分结合起来:

根 基础 相对 文件

示例:根路径 = 根名称 + 根目录

注意这对 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 [绝对] 文件路径

“文件名”是一个单词,所以一般我们应该使用“文件名”而不是“文件名”(并且文件名不是文件名)。

“目录”一词可以替换为“文件夹”一词。 (也许我们应该在较低级别使用“目录”,但我更喜欢“文件夹”更短。)

实际上可以创建所有这些类型的语义框架,并使用语义上有效的函数来组合它们。例如,FolderNameFilename 可以组合得到RelativeFilePathFolderPath(隐含绝对值)和RelativeFilePath 可以组合得到FilePath(隐含绝对值)。

此外,其中一些是相关的;例如FilenameWithoutExtensionFilename 的一种,所以应该是可转换的。 FolderNameRelativeFolderPath,所以应该是可转换的。等等。

【讨论】:

以上是关于路径组件的命名标准是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 emacs lisp 中将多个路径组件加入到单个完整路径中的正确方法是啥?

linux 机器上 apache-tomcat 的推荐/标准安装路径是啥

在 ExtJs4 中重命名组件的路径

iOS 应用路径中的长 ID 是啥?

Python常用标准库-os库一文详解:文件操作和路径操作

我应该如何构建多用途 Vue 组件以从不同的 Vuex 路径加载数据?