path

109 阅读4分钟

绝对路径

绝对路径是从文件系统的根目录开始的完整路径,可以唯一地标识文件或目录的位置。绝对路径是以根目录开始的

  • 在Unix/Linux系统中,绝对路径是类似于/home/user/documents/file.txt,它从根目录/开始,并按照目录结构一直描述到目标文件或目录。
  • 在Windows系统中,绝对路径是类似于C:\Users\User\Documents\file.txt的形式。

相对路径

相对路径是相对于当前工作目录的路径,描述了目标文件或目录与当前位置之间的关系。相对路径以当前目录开始的

  • 在Unix/Linux系统中,如果当前工作目录是/home/user,那么相对路径documents/file.txt指的是/home/user/documents/file.txt。
  • 在Windows系统中,如果当前工作目录是C:\Users\User,那么相对路径Documents\file.txt指的是C:\Users\User\Documents\file.txt。

POSIX 和 Windows

POSIX(Portable Operating System Interface)是一系列IEEE标准,旨在促进和保证应用程序和操作系统之间的兼容性。POSIX定义了一套广泛的操作系统接口,包括但不限于系统调用、命令行工具和实用程序的规范。

  • Windows

    • 路径分隔符是反斜杠(``),例如 C:\Users\Example\file.txt,这是一个历史原因导致不完全遵守POSIX标准
    • 文件路径可以是相对的也可以是绝对的,绝对路径通常以盘符开头。
    • 不区分大小写,C:\Usersc:\users 被认为是相同的路径。
  • POSIX

    • 在 UNIX、Linux、macOS(基于UNIX)等系统中遵循 POSIX 标准。

    • 路径分隔符是正斜杠(/),例如 /home/example/file.txt

    • 文件路径同样可以是相对的或绝对的,绝对路径以根目录 / 开头。

    • 区分大小写,/home/Users/home/users 被认为是不同的路径。

  • 当使用 Windows 文件路径时,若要在任何操作系统上获得一致的结果,则使用 path.win32

path.win32.basename('C:\\temp\\myfile.html');
// Returns: 'myfile.html'
  • 当使用 POSIX 文件路径时,若要在任何操作系统上获得一致的结果,则使用 path.posix
path.posix.basename('/tmp/myfile.html');
// Returns: 'myfile.html'

常用的方法

  • path.resolve([...paths])

拼接路径, 会从左向右找到第一个绝对路径, 往后开始拼接,他能够识别 . 和 .. 这样的运算符

path.resolve('/foo/bar', './baz');
// Returns: '/foo/bar/baz'

path.resolve('/foo/bar', '/tmp/file/');
// Returns: '/tmp/file'

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// If the current working directory is /home/myself/node,
// this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'
  • path.join

拼接路径, 会将路径中的 / 替换为当前系统的路径分隔符

const filePath = path.join('dir', 'subdir', 'file.txt');
console.log(filePath);
// 输出在 Unix 上: "dir/subdir/file.txt"
// 输出在 Windows 上: "dir\subdir\file.txt"
  • path.sep

获取当前操作系统的路径盘符

'foo/bar/baz'.split(path.sep);
// Returns: ['foo', 'bar', 'baz']
  • path.parse(path)

解析路径并返回一个对象

path.parse('/home/user/dir/file.txt');
// Returns:
// { root: '/',
//   dir: '/home/user/dir',
//   base: 'file.txt',
//   ext: '.txt',
//   name: 'file' }
  • path.format(pathObject)

从一个对象返回路径字符串,是 path.parse 的逆操作。

  • 我们把从parse中解析成对象的再丢进format中试试
  • 这里有一个点要注意,我们的路径用posix的/,而不是window的``。所以需要在path这个API后面加上posix(强制使用特定风格的路径分隔符)。如果不加就会默认当前系统的习惯(比如我是Windows系统,就会变成path.win32.format()),结果就会是/home/user/dir\file.txt这样的路径不统一
// 将如下的对象格式化成路径
{
  root: '/',
  dir: '/Users/luochun/LearnRecord/node',
  base: '01.js',
  ext: '.js',
  name: '01'
}

console.log(
  "🚀 ~ This is a result of console.log ~ ✨: ",
  path.format({
    root: "/",
    dir: "/Users/luochun/LearnRecord/node",
    base: "01.js",
    ext: ".js",
    name: "01",
  })
);

//  /Users/luochun/LearnRecord/node/01.js
  • path.basename(path[, suffix])

获取路径下的文件名称, 第二个参数可以删除

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

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

获取路径的目录名称

path.dirname('/foo/bar/baz/asdf/quux');
// Returns: '/foo/bar/baz/asdf'
  • path.extname(path)

获取文件的扩展名称

path.extname('index.html');
// Returns: '.html'

path.extname('index.coffee.md');
// Returns: '.md'

path.extname('index.');
// Returns: '.'

path.extname('index');
// Returns: ''

path.extname('.index');
// Returns: ''

path.extname('.index.md');
// Returns: '.md'
  • path.join([...paths])

拼接路径, 他能够识别 . 和 .. 这样的运算符, 如果不是字符串类型的数据,会报错

path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// Returns: '/foo/bar/baz/asdf'

path.join('foo', {}, 'bar');
// Throws 'TypeError: Path must be a string. Received {}'

__dirname 和 __filename

__dirname: 是一个全局变量, 保存的是: 所在文件的所在目录的绝对路径(目录的绝对路径) __filename: 是一个全局变量,保存的是: 所在文件的绝对路径