当我操纵路径和文件名时,我一直处于打结状态,因为我没有使用的常用命名系统。
我需要提出一个命名标准并坚持下去,我希望与其他人保持清晰和一致,所以我开放学习规范的答案。
考虑这个玩具问题:( 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的术语吗?
答案 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
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
从树顶到叶子的路径
相对路径
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
答案 1 :(得分:22)
在C ++中,Boost.Filesystem已经为路径的各个部分设计了一个命名法。有关详细信息,请参阅path decomposition参考文档,以及tutorial。
以下是基于本教程的摘要。为:
c:\foo\bar\baa.txt
/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++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年的黑客入侵,我的两便士是:
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之间进行区分路径,则“相对路径”将排除文件名,但将目录从基础目录转移到工作目录,尽管该术语变得多余,因为它被适当地称为相对目录)。
请注意关键字的不同含义:
然后将这些与完整路径的部分组合在一起:
示例:根路径=根名称+根目录
请注意这对于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);
}
});