在 Node.js 中获取当前工作目录名称而不是路径

luc*_*aro 9 javascript node.js

我正在开发一个需要使用当前目录名称的 CLI 应用程序。

我可以使用process.cwd(). 如何获取当前目录名称而不是整个路径?

可以执行以下操作吗?

process.cwd().split('/').slice(-1)[0]
Run Code Online (Sandbox Code Playgroud)

它有效,但感觉很脆弱。这样做的最佳和最强大的方法是什么?

luc*_*aro 15

即使答案中的代码有效,您也应该使用path.basename()来获取路径最后一部分的名称,因为:

  • 它可以跨操作系统工作(Windows 和类 Unix 系统使用不同的路径分隔符)
  • 它忽略尾随目录分隔符(即最后//path/to/cwd/

此外,为了额外的安全,您应该使用path.resolve()它,因为它在获取基本名称之前规范了路径,摆脱了与路径相关的怪癖。

如果您可以获得/path/to/cwdwith process.cwd(),那么以下内容将为您提供目录的名称("cwd"在示例中):

path.basename(process.cwd())
Run Code Online (Sandbox Code Playgroud)

添加path.resolve()额外的安全:

path.basename(path.resolve(process.cwd()))
Run Code Online (Sandbox Code Playgroud)

甚至:

path.basename(path.resolve())
Run Code Online (Sandbox Code Playgroud)

例子:

const path = require('path');

function slice(pathName) {
  const res = pathName.split(path.sep).slice(-1)[0];
  console.log('slicer  ', pathName, '=>', `'${res}'`);
}

function basename(pathName) {
  const res = path.basename(path.resolve(pathName));
  console.log('basename', pathName, '=>', `'${res}'`);
}

slice('/path/to/cwd'); // cwd
basename('/path/to/cwd'); // cwd

slice('/path/to/cwd/'); // ''
basename('/path/to/cwd/'); // cwd

// Other valid paths
slice('/path/to/cwd/..'); // '..'
basename('path/to/cwd/..'); // cwd

slice('.'); // '.'
basename('.'); // <current directory name>
Run Code Online (Sandbox Code Playgroud)

进程.cwd()

Returns: <string>
Run Code Online (Sandbox Code Playgroud)

process.cwd() 方法返回 Node.js 进程的当前工作目录。

console.log(`Current directory: ${process.cwd()}`);
Run Code Online (Sandbox Code Playgroud)

保证是当前工作目录的绝对路径。用这个!

path.basename(path[, ext])

path <string>
ext <string> An optional file extension
Returns: <string>
Run Code Online (Sandbox Code Playgroud)

path.basename()方法返回路径的最后一部分,类似于 Unix basename 命令。尾随目录分隔符将被忽略,请参见 path.sep。

path.basename('/foo/bar/baz/asdf/quux.html');
// Returns: 'quux.html'

path.basename('/foo/bar/baz/asdf/quux.html', '.html');
// Returns: 'quux'
Run Code Online (Sandbox Code Playgroud)

如果 path 不是字符串或者 ext 不是字符串,则抛出 TypeError 。

path.resolve([...路径])

...paths <string> A sequence of paths or path segments
Returns: <string>
Run Code Online (Sandbox Code Playgroud)

path.resolve() 方法将一系列路径或路径段解析为绝对路径。

给定的路径序列从右到左处理,每个后续路径都在前面,直到构建绝对路径。例如,给定路径段的序列:/foo, /bar, baz,调用 path.resolve('/foo', '/bar', 'baz') 将返回 /bar/baz。

如果在处理完所有给定的路径段后还没有生成绝对路径,则使用当前工作目录。

生成的路径被规范化并删除尾部斜杠,除非路径解析为根目录。

零长度路径段被忽略。

如果没有传递路径段, path.resolve() 将返回当前工作目录的绝对路径。

如果你可以使用process.cwd()path.resolve()在其他情况下不需要的,使用它!。


Nel*_*alo 5

您正在寻找path.basename

const path = require('path'); 
path.basename(CWD)
Run Code Online (Sandbox Code Playgroud)

所述path.basename()方法返回的路径的最后部分。尾随目录分隔符被忽略。