文件名?路径名称?基地名称?命名路径的标准

时间:2010-02-10 07:45:37

标签: language-agnostic cross-platform terminology filenames

当我操纵路径和文件名时,我一直处于打结状态,因为我没有使用的常用命名系统。

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

考虑这个玩具问题:( 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 top of the tree.
F) Widget\foo.src - i.e. the path from the top of the tree to the leaf.
G) Widget - i.e. one node of the tree.
H) C:\users\OddThinking\Documents\My Source\Widget\ - i.e. the name of the folder
I) C:\users\OddThinking\Documents\My Source\Widget\foo.src

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

A)基地名称?

B)文件名?还是文件名?选择标识符名称时,差异很重要,我在这里永远不会保持一致。

C)扩展

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

H)路径名称?或者等一下,这只是路径吗?

I)文件名。等等,这就是我所说的C. Path。等等,这就是我所说的H.也许H应该是文件夹名称。但“文件夹”不是特定于Windows的术语吗?

7 个答案:

答案 0 :(得分:136)

我认为您对“标准”命名惯例的搜索将是徒劳的。以下是我的建议,基于现有的众所周知的计划:

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

答案 1 :(得分:22)

在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

此外,C++17 =&gt;采用了Boost.Filesystem术语。见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

答案 2 :(得分:6)

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

d:\dir1\dir2\myfile.txt

被理解为:

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

Unix / Linux方法更合乎逻辑,这是上面提到的每个人:完整路径,包括文件名本身。但是,如果您键入&#34; call /?&#34;在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

所以它就是,&#34;仅限路径&#34;和&#34;仅文件名&#34;。同时,他们将整个字符串称为&#34;完全限定的路径名​​称&#34;这被理解为驱动器号加路径加文件名。

我只是告诉这一点,让每个人都不要因为围绕这个话题而陷入困境。 没关系。你并不疯狂。路径名称是:)

答案 3 :(得分:3)

Python的<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> <script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256- WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"> </script> </head> <body> <form name="myform" id="submitForm" method="post"></form> <input type="button" id="btnClick" onclick="return onButtonSubmitClick()" name="submit" value="submit" /> <script> $(document).ready(function () { $('#btnClick').on('click', function () { document.forms["myform"].submit(); window.open("https://www.google.com","_blank"); }); }); </script> </body> </html> 标准库对路径组件具有很好的命名约定: https://docs.python.org/3/library/pathlib.html

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

  

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

  

大父路径

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

  

相对于父级路径的相对路径

g)C:\ users \ OddThinking \ Documents \ My Source \ 小部件 \ foo.src

  

父母姓名

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

  

父路径

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

  

路径

答案 4 :(得分:1)

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

目录始终以文件分隔符结尾,并且永远不包含文件名。它们可以很容易地附加。 “目录名称”可以指向任何位置的任何目录(dirName + sep = dir)。

路径包括根,文件名或两者。

也就是说,可以通过将根目录,文件名或两者都添加到目录来形成路径。(您可以在 path file之间进行区分路径,则“相对路径”将排除文件名,但将目录从基础目录转移到工作目录,尽管该术语变得多余,因为它被适当地称为相对目录)。

请注意关键字的不同含义:

  • 名称
  • 目录
  • 路径
  • 分隔符

然后将这些与完整路径的部分组合在一起:

  • root
  • 基地
  • 相对
  • 文件

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

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

答案 5 :(得分:0)

A)foo

不带扩展名的文件名

B)foo.src

文件名

C)src

没有点的扩展名

D).src

扩展名

E)C:\ users \ OddThinking \ Documents \ My Source \-即树的顶部。

[绝对](工作|当前|活动|根)目录路径

F)Widget \ foo.src-即从树的顶部到叶子的路径。

相对文件路径

G)小部件-即树的一个节点。

目录名称

H)C:\ users \ OddThinking \ Documents \ My Source \ Widget \-即文件夹的名称

[绝对]目录路径

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

[绝对]文件路径

“文件名”是一个词,因此通常我们应该使用“文件名”而不是“文件名”(文件名不是FileName)。

我们的工作水平较低,因此我们可能应该将它们称为目录,而不是文件夹,但是如果您保持一致,则两者都可以。

答案 6 :(得分:0)

您可以为简单项目采用的简单答案:

    const { OAuth2 } = google.auth;

    const GMAIL_CLIENT_ID = "";
    const GMAIL_CLIENT_SECRET = "";
    const GMAIL_REFRESH_TOKEN = "";
    const GMAIL_ID = "";
    const OAUTH_PLAYGROUND = "https://developers.google.com/oauthplayground";

    const oauth2Client = new OAuth2(
      GMAIL_CLIENT_ID,
      GMAIL_CLIENT_SECRET,
      OAUTH_PLAYGROUND
    );

    oauth2Client.setCredentials({
      refresh_token: GMAIL_REFRESH_TOKEN,
    });

    google.options({ auth: oauth2Client }); // Apply the settings globally 

    const accessToken = new Promise((resolve, reject) => {
      oauth2Client.getAccessToken((err, token) => {
        if (err) console.log(err); // Handling the errors
        else resolve(token);
      });
    });

    const transporter = nodemailer.createTransport({
      service: "gmail",
      auth: {
        type: "OAuth2",
        user: GMAIL_ID,
        clientId: GMAIL_CLIENT_ID,
        clientSecret: GMAIL_CLIENT_SECRET,
        refreshToken: GMAIL_REFRESH_TOKEN,
        accessToken,
      },
    });

    const mailOptions = {
      from: GMAIL_ID,
      to: "to-email@gmail.com",
      subject: "subject",
      text: "message",
    };

    transporter.sendMail(mailOptions, (err, info) => {
      if (err) {
        console.log(err);
      } else {
        console.log(info);
      }
    });