路径组件的命名标准是什么?

在操作路径和文件名时,我总是陷入困境,因为我没有遵循路径组件的命名标准。

考虑下面的玩具问题(以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\ (absolute path of the root)
F. Widget\foo.src (relative path of the file to absolute path of the root)
G. Widget\
H. C:\Users\OddThinking\Documents\My Source\Widget\
I. C:\Users\OddThinking\Documents\My Source\Widget\foo.src

以下是我的尝试:

A.基地名称?Basename吗?

B.文件名?文件名吗?在选择标识符名称时,差异很重要,这里我从来没有保持一致。

c扩展吗?

d .扩展吗?等等,这就是我所说的c,我应该避免存储点,只在需要的时候放进去吗?如果某个文件上没有点怎么办?

大肠吗?

f ?

g .文件夹吗?但这不是windows特有的术语吗?

H.路径名称?路径名吗?路径?

一、文件名?等等,这就是我说的c路径名?等等,这就是我说的H。

69234 次浏览

我认为你对“标准”的追求;命名惯例将是徒劳的。以下是我根据现有的知名项目提出的建议:

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
___ (without dot)

文件/文件名扩展名 .

D) C:\users\OddThinking\Documents\My Source\Widget\foo.src
____ (with dot)

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

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

树顶
没有约定,git称之为基地目录

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

从树顶到叶子的路径
相对路径< / p >

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
-------------------------------------------------------

完整/绝对路径

首先,好问题,我的+1。当我必须在Utility类中创建大量函数时,这件事让我很困扰。GetFileName吗?还是GetFullName ?GetApplicationPath是指完整路径还是目录名?等等。我来自。net背景,所以我认为我可以为@blinry的出色回答补充更多。

< >强简介:(斜体是我作为程序员不会使用的)

  1. 路径: Path指定文件系统中的唯一位置(除非它的相对路径)。路径名称使用较少,但我会坚持使用Path -它在很大程度上解释了它是什么。路径可以指向一个文件或文件夹,甚至什么都没有(C:\)。路径可以是:

    1. 相对路径: My Source\Widget\Widget\foo.src一样是相对路径。自我解释。
    2. 绝对路径完整路径:指向目标的完全限定路径。我更倾向于使用后者。C:\users\OddThinking\Documents\My Source\Widget\foo.src因此是全路径。在结尾,我称之为全路径,它指向一个文件,结束于一个目录。

    路径wiki页面和。net命名是一致的

  2. 根路径根目录:前者是. net惯例,后者在UNIX圈子里更常见。虽然两者我都喜欢,但我更倾向于使用前者。与UNIX不同,在windows中有许多不同的根路径,每个分区对应一个根路径。Unix系统有一个根目录,保存其他目录和文件的信息。如。C:\是根路径。

  3. 文件夹文件夹名称: WidgetOddThinking等在你的情况下。这可能是Windows特有的惯例(事实上这是我自己的奇怪想法:)),尽管如此,我强烈反对blinry的回答“目录”。虽然对于一个普通的用户目录意味着相同的作为一个文件夹(像子文件夹,子目录),但我认为从技术角度来看,“目录”应该听起来像一个目标的合格地址,而不是目标本身。下面的更多。

    1. 子文件夹:相对于usersOddThinkingDocuments是子文件夹。
    2. 子目录:相对于usersOddThinking\OddThinking\Documents\OddThinking\Documents\My Source\Widget\是子目录。但我们并不经常需要为此烦恼,不是吗?
    3. 子文件夹:相对于usersOddThinking是一个子文件夹(以及子文件夹)
    4. 父文件夹:对于OddThinkingusers是它的父文件夹(只是提到不同的术语,没什么大不了的)。
    5. 李< / ol > < / >
    6. 目录目录名称:前者在现实生活中一般使用,后者为代码。这指的是完全限定路径(或简单地说全路径),直到目标的父文件夹。在你的情况下,C:\users\OddThinking\Documents\My Source\Widget(是的,一个目录从来没有指向一个文件)。我在代码中使用目录名,因为目录是. net中的一个类,而目录名是库本身调用它的名称。它与UNIX系统中使用的dirname非常一致。

    7. File Name or Basename:带扩展名的文件名。在你的例子中:foo.src。我想说,对于非技术用途,我更喜欢文件名(这是最终用户的意思),但出于技术目的,我会严格坚持basename。文件名通常由MS使用,,但我很惊讶,它们不仅在文档中,甚至在库中都不一致。文件名可以是文件的基名或完整路径。所以我喜欢用basename,这是我在代码中的叫法。这个页面在wiki上也说文件名可以意味着完整路径或basename。令人惊讶的是,即使在。net中,我也可以发现basename的用法表示文件的根名称。

    8. 扩展 or 文件扩展名 or 文件扩展名:我喜欢最后一个。所有都指的是同一件事,但到底是什么又是一个争论的问题!维基说它是src,而当时我记得读到许多语言将它解释为.src。注意这个点。所以再一次,我的看法是,对于随意的使用,它是什么并不重要,但作为一个程序员,我总是把扩展名看作.src

      好吧,我可能已经尝试了一些标准用法,但这里有两个我遵循的惯例。它是关于全路径的。

      1. 我通常称指向文件的完整路径为文件路径。对我来说,文件路径是明确的,它告诉我它是什么。虽然有了文件名,我发现它是文件名,在我的代码中,我称它为文件名。这也与“目录名”一致。从技术方面来说,名称是指完全限定的名称!令人沮丧的是。net使用术语文件名(所以我在这里有我的案例),有时文件路径。

      2. 我把以目录结尾的完整路径称为目录。事实上,我们可以把任何不指向文件的地址称为目录。所以C:\users\OddThinking\Documents\My Source\是一个目录,C:\users\OddThinking\是一个目录,甚至OddThinking\Documents\My Source\(称它为子目录更好,甚至更好的相对路径-所有这些都取决于你正在处理它的上下文)。上面我提到了不同的目录,也就是目录名。以下是我的看法:为了避免混淆,我将找到一条新的路径。这个D:\Fruit\Apple\Pip\是什么?一个目录。但如果问题是D:\Fruit\Apple\Pip\的目录或更好的目录名称是什么,答案是D:\Fruit\Apple\。希望它是清晰的。

      我想说的是,最好不要担心最后两项,因为它们(对我个人来说)是最容易造成困惑的。只要使用术语完整路径!< / p >

    回答你: < / >强

    1. < p > 关于你所给出的路径

      A)不知道。不管怎样,我从来都不需要一个人。

      B):

      C)我暂时把它叫做文件扩展名,我最不担心,因为我从来不需要在我的代码中单独命名它。

      D,文件扩展名。

      E)我不认为这是一个通用的要求。不知道。在. net中,base目录与目录名相同。

      F)相对路径

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

      H)目录名

      I)完整路径(甚至文件名)

    2. < p > 一般来说(抱歉有点啰嗦,只是为了说明问题),但假设foo.src确实是一个文件

      一)钠

      B):

      C)钠

      D)扩展

      E)目录或路径

      F)相对路径

      G)钠

      H)目录或简单的路径

      I)完整路径(甚至文件名)

    我举一个例子进一步说明: < / >强

    1. 考虑路径C:\Documents and Settings\All Users\Application Data\s.sql

      1. C:\Documents and Settings\All Users\Application Data\s.sql是完整路径(是一个文件名)
      2. C:\Documents and Settings\All Users\Application Data\是目录名。
      3. 李< / ol > < / >
      4. 现在考虑路径C:\Documents and Settings\All Users\Application Data

        1. C:\Documents and Settings\All Users\Application Data是完整路径(恰好是一个目录)
        2. C:\Documents and Settings\All Users是目录名。
        3. 李< / ol > < / >

        我的两个建议: < / >强

        1. 我遵循这个经验法则,当涉及到寻址完整地址而不考虑其类型时,我几乎总是称其为“完整路径”。这不仅消除了文件路径和文件夹路径这两个术语的使用,还避免了将文件命名为文件名(对大多数用户来说,这立即转换为basename)时可能出现的混淆。但是,如果你必须明确路径的类型,最好是命名文件名或目录,而不是更通用的“路径”。

        2. 无论你的想法是什么,都要始终保持一致。在团队成员之间达成共识,这意味着这个而不是那个。

        现在我有了一些练习。在OS X和android机器上使用的术语将会是一个新的品牌。所有这些都是关于文件系统中的物理路径。就网址而言,一套全新的术语将会出现。我希望有人能在同一条线索中填补空白:)我很高兴听到你所进行的公约。

在c++中,提振。文件系统为路径的各个部分设计了一个命名法。有关详细信息,请参阅路径分解参考文档,以及这个教程

下面是基于教程的总结。:

  • 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

而且刺激。文件系统术语已被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系统中,有时文件所在目录的路径被称为路径,它从一开始就是这样。举个例子,

    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方法更符合逻辑,这就是上面每个人都提到的:路径包括文件名本身。然而,如果你输入“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

就是这样,“仅限路径”;和“文件名称”。同时,它们将整个字符串称为“完全限定路径名”。也就是盘符加路径加文件名。所以没有真正的真相。这是徒劳的。你被背叛了。

不管怎么说,

回答你的问题

以下是我给你举的例子:

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"所以我还是用这个名字吧。全名也很明显;全路径可能有点模糊,但大多数时候它的意思是完全相同的。

Python中的Pathlib标准库遵循路径组件的命名约定:

A. /x/y/ 阀杆. gz: 阀杆. gz。

B. /x/y/z.tar.gz: 的名字

c / x / y / z.tar。gz(不包括点):N/A。

D. /x/y/z.tar.gz(含点):后缀. txt。

E. /x/y/z.tar.gz: 父路径. gz。

F. /x/y/z.tar.gz: 父路径的相对路径

G. /x/y/z.tar.gz: 父母的名字. gz。

H. /x/y/z.tar.gz: 父路径. gz。

I. __abc0: __abc1。

  • < p > foo 没有扩展名的文件名

  • < p > foo.src 文件名

  • < p > src 扩展

  • .src可能是带点扩展,但不应该使用。如前所述,这可能是一个目录名或文件名。

  • < p > C:\users\OddThinking\Documents\My Source\ [Absolute]目录路径

  • < p > Widget\foo.src 相对文件路径

  • < p > Widget 目录名称

  • 这仍然是一个绝对目录路径。如果一个是根,另一个不是,这取决于你的变量名来跟踪它,这里没有真正的语义差异。

  • < p > C:\users\OddThinking\Documents\My Source\Widget\foo.src [Absolute]文件路径

“Filename"是一个词,所以一般我们应该用“文件名”;而不是“文件名称”;(和Filename不是Filename)。

“目录”这个词;可以用“文件夹”代替。(也许我们应该用“目录”;在较低的水平,但“;文件夹”;我更喜欢短一点的。)

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

还有一些是相关的;例如FilenameWithoutExtension是一种Filename,所以应该是可转换的。FolderNameRelativeFolderPath,所以应该是可转换的。等。

简单的答案,你可以采用简单的项目: 没有使用path这个词,因为如果使用url /path,它有助于将其与web路径区分开来

| name       | example          |
|------------|------------------|
| file       | /foo/bar/baa.txt |
| filename   | baa.txt          |
| stem       | baa              |
| suffix     | .txt             |
| ext        | txt              |
| dir        | /foo/bar/        |
| dirname    | bar              |
| parent     | /foo/bar/        |
| parentname | bar              |

在我花了10年的钱之后

  • 是一致的
  • 认为递归

enter image description here

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,结果被称为路径!

目录总是以文件分隔符结尾,从不包括文件名。它们很容易被追加。 “目录name"可以引用任意位置的任意目录(dirName + sep = dir).

路径包括根文件、文件名或两者都包含。

也就是说,路径可以通过向目录中添加根或文件名或两者之一来形成。(你可以区分路径文件路径,“相对路径”会排除文件名,但会给出从基本目录到工作目录的目录,尽管这个术语变得多余,因为它被正确地称为相对目录)。

注意关键字的不同含义:

  • 的名字
  • 目录
  • 路径
  • 分隔符

然后将它们与完整路径的部分组合:

  • 基地
  • 相对
  • 文件

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

注意这对于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