path模块在不同的操作系统是有差异的(windows | posix)
POSIX(Portable Operating System Interface)是一系列IEEE标准,旨在促进和保证应用程序和操作系统之间的兼容性。POSIX定义了一套广泛的操作系统接口,包括但不限于系统调用、命令行工具和实用程序的规范。
POSIX的核心目标
- 可移植性:使得软件可以在支持POSIX标准的任何操作系统上编写一次,到处运行。
- 兼容性:通过标准化操作系统的接口,减少不同系统之间的差异。
- 互操作性:使不同系统上的应用程序能够相互通信和协作。
主要内容
- 系统接口:定义了一组系统调用接口,包括文件操作、进程控制、线程和同步、内存管理等。
- Shell和实用程序 :规定了标准Shell(sh)的行为和一组标准的命令行实用程序,如
ls
、grep
等。 - 程序编写:定义了C语言的编程接口,包括库函数和头文件。
POSIX的应用
- Unix和类Unix系统:大多数基于Unix的系统(如Linux、macOS、BSD)都遵循或部分遵循POSIX标准。
- 嵌入式系统:一些嵌入式操作系统也实现了POSIX标准的子集,以利于移植和开发。
- 跨平台编程:遵循POSIX标准可以提高代码在不同操作系统间的可移植性。
Windows 和 POSIX 路径的差异
- Windows :
- 路径分隔符是反斜杠(
\
),例如C:\Users\Example\file.txt
,这是一个历史原因导致不完全遵守POSIX标准 - 文件路径可以是相对的也可以是绝对的,绝对路径通常以盘符开头。
- 不区分大小写,
C:\Users
和c:\users
被认为是相同的路径。
- 路径分隔符是反斜杠(
- POSIX :
- 在 UNIX、Linux、macOS(基于UNIX)等系统中遵循 POSIX 标准。
- 路径分隔符是正斜杠(
/
),例如/home/example/file.txt
。 - 文件路径同样可以是相对的或绝对的,绝对路径以根目录
/
开头。 - 区分大小写,
/home/Users
和/home/users
被认为是不同的路径。
js
const path = require('path');
// 使用 Windows 风格的路径处理
const windowsPath = path.win32.join('C:\\', 'Users', 'Example', 'file.txt');
// 使用 POSIX 风格的路径处理
const posixPath = path.posix.join('/home', 'example', 'file.txt');
Path用法
- Node.js 中的
path
模块提供了一系列实用工具,用于处理文件和目录的路径。这个模块可以帮助我们构造、解析和转换路径字符串。由于不同操作系统中文件路径的表示方式可能不同(如Windows使用反斜杠\
,而POSIX(Unix、Linux、macOS等)系统使用斜杠/
),path
模块封装了这些差异,使路径操作在不同平台上更加一致。
path.basename
- path.basename(path[, ext]) :返回
path
(给定路径) 的最后一部分,可以通过ext
参数去除文件扩展名。- 如果你仔细看,会发现我们下面采用的是POSIX标准,但在windows也可以使用(兼容了正反斜杠的写法),这正如前面所说的,
path
模块封装了这些差异,使路径操作在不同平台上更加一致
- 如果你仔细看,会发现我们下面采用的是POSIX标准,但在windows也可以使用(兼容了正反斜杠的写法),这正如前面所说的,
js
const path = require('path');
console.log(path.basename('/foo/bar/baz/asdf/quux.html'));; // 返回: 'quux.html'
console.log(path.basename('\\foo\\bar\\baz\\asdf\\quux.html'));;//一样 返回: 'quux.html',其中\需要写两个是因为需要进行转义(Windows写法,POSIX处理不了)
console.log(path.basename('/foo/bar/baz/asdf/quux.html', '.html'));; // 返回: 'quux'
path.dirname
- path.dirname(path) :返回
path
的目录部分,类似于 Unix 中的dirname
和node中的__dirname
命令。跟上面的basename就刚好反过来了
js
const path = require('path');
console.log(path.dirname('/foo/bar/baz/asdf/quux.html'));; // 返回: '/foo/bar/baz/asdf'
console.log(path.dirname('\\foo\\bar\\baz\\asdf\\quux.html'));;//返回'\foo\bar\baz\asdf'
ath.extname
- path.extname(path) :返回
path
的扩展名,从最后一个.
到字符串结束。如果没有.
或path
基本名称以.
开始,则返回空字符串。- 通常可以用来判断当前文件是什么个东西(是图片还是个视频或者是一个js文件?)
js
const path = require('path');
console.log("1",path.extname('index.html'));; // 返回: '.html'
console.log("2",path.extname('index.coffee.md'));; // 返回: '.md'
console.log("3",path.extname('index.'));; // 返回: '.'
console.log("4",path.extname('index'));; // 返回: ''
console.log("5",path.extname('.index'));; // 返回: ''
path.join
- path.join([...paths]) :将所有给定的
paths
片段连接在一起,然后规范化生成的路径(拼接路径 )。处理平台特定的分隔符,如POSIX上的/
和Windows上的\
。
js
const joinedPath = path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// POSIX: '/foo/bar/baz/asdf'
// Windows: '\\foo\\bar\\baz\\asdf'
console.log(joinedPath);
//如果你疑惑为什么结果会没有quux这个内容,那是因为最后还有一个..,这个join拼接是支持回退的
//如果是../,返回的结果就会是\foo\bar\baz\asdf\,最后面多一个斜杠
path.resolve
- path.resolve([...paths]):将路径或路径片段的序列解析为绝对路径。给定的路径序列从右至左被处理,直到构造出绝对路径为止。如果在处理所有给定的路径片段后还未能生成绝对路径,则会使用当前工作目录。
- 如果都是绝对路径,就返回最后一个
- 如果只有一个相对路径,返回当前工作的绝对路径
- 相对路径+绝对路径(典型的
__dirname和当前文件拼接
),返回的还是绝对路径
js
const path = require('path');
// 示例 1: 基本用法
console.log(path.resolve('/foo/bar', './baz'));
// 输出: '/foo/bar/baz'
// 解释: 从'/foo/bar'开始,'./baz'相对于'/foo/bar'解析为'/foo/bar/baz'
// 示例 2: 使用 '..' 导航到父目录
console.log(path.resolve('/foo/bar', './baz', '../qux'));
// 输出: '/foo/bar/qux'
// 解释: 从'/foo/bar'开始,'./baz'解析为'/foo/bar/baz',然后'../qux'将路径移动到父目录'/foo/bar',并附加'qux'
// 示例 3: 当路径为空时,默认为当前工作目录
console.log(path.resolve());
// 输出: 当前工作目录的绝对路径
// 解释: 由于没有提供路径,path.resolve将返回当前工作目录的绝对路径
// 示例 4: 当最后一个参数是绝对路径时
console.log(path.resolve('/foo/bar', '/tmp/file/'));
// 输出: '/tmp/file'
// 解释: '/tmp/file/'是绝对路径,因此path.resolve立即返回它
// 示例 5: 当路径片段是相对路径时
console.log(path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'));
// 输出: 如果当前工作目录为'/home/myself/node',则返回'/home/myself/node/wwwroot/static_files/gif/image.gif'
// 解释: 从当前工作目录开始,依次解析'wwwroot', 'static_files/png/', '../gif/image.gif'为绝对路径
// 示例 6: 结合Windows盘符使用(在Windows环境下)
console.log(path.resolve('C:\\path\\to\\file\\', '..\\img\\picture.png'));
// 输出: 'C:\path\to\img\picture.png'
// 解释: 从'C:\path\to\file\'开始,'..\\img\\picture.png'相对于'C:\path\to\file\'解析为'C:\path\to\img\picture.png'
// 示例 7: 使用多个相对路径片段
console.log(path.resolve('tmp', 'local', '..', 'uploads'));
// 输出: 如果当前工作目录为'/home/user/project',则返回'/home/user/project/tmp/uploads'
// 解释: 从当前工作目录开始,依次解析'tmp', 'local', '..', 'uploads'为绝对路径
// 示例 8: 没有找到绝对路径时使用当前工作目录
console.log(path.resolve('myapp', 'views'));
// 输出: 如果当前工作目录为'/home/user/project',则返回'/home/user/project/myapp/views'
// 解释: 由于'myapp/views'是相对路径,path.resolve将其与当前工作目录结合,形成绝对路径
path.parse
- path.parse(path) :将
path
字符串解析成一个对象,包含dir
、root
、base
、name
和ext
等属性。
js
const path = require('path');
path.parse('/home/user/dir/file.txt');
// 返回:
// { root: '/',
// dir: '/home/user/dir',
// base: 'file.txt',
// ext: '.txt',
// name: 'file' }
path.format
- path.format(pathObject) :从一个对象返回路径字符串,是
path.parse
的逆操作。- 我们把从parse中解析成对象的再丢进format中试试
- 这里有一个点要注意,我们的路径用posix的
/
,而不是window的\
。所以需要在path这个API后面加上posix(强制使用特定风格的路径分隔符)。如果不加就会默认当前系统的习惯(比如我是Windows系统,就会变成path.win32.format()
),结果就会是/home/user/dir\file.txt
这样的路径不统一
js
const path = require('path');
console.log(path.posix.format(
{
root: '/',//根目录
dir: '/home/user/dir',//文件所在目录
base: 'file.txt',//文件名+后缀名
ext: '.txt',//文件扩展名(后缀名)
name: 'file'//文件名
}
))
// 返回/home/user/dir/file.txt
path.sep
path.sep
用于提供平台特定的路径分隔符
js
const path = require('path');
// 输出路径分隔符
console.log(path.sep);
// 在 POSIX 系统上,输出:'/'
// 在 Windows 系统上,输出:'\\'