对于大多数 fs 模块的函数,path 或 filename 参数可以传入 WHATWG [URL] 对象。
仅支持使用 file: 协议的 [URL] 对象。
const fs = require('fs');const fileUrl = new URL('file:///文件');fs.readFileSync(fileUrl);
file: URL 始终是绝对路径。
使用 WHATWG [URL] 对象可能会采用特定于平台的行为。
在 Windows 上,带有主机名的 file: URL 会转换为 UNC 路径,而带有驱动器号的 file: URL 会转换为本地的绝对路径。
没有主机名和驱动器号的 file: URL 会导致抛出错误:
// 在 Windows 上:// - 带有主机名的 WHATWG 文件的 URL 会转换为 UNC 路径。// file://主机名/文件 => \\主机名\文件fs.readFileSync(new URL('file://主机名/文件'));// - 带有驱动器号的 WHATWG 文件的 URL 会转换为绝对路径。// file:///C:/文件 => C:\文件fs.readFileSync(new URL('file:///C:/文件'));// - 没有主机名的 WHATWG 文件的 URL 必须包含驱动器号。fs.readFileSync(new URL('file:///无驱动器号/文件'));fs.readFileSync(new URL('file:///文件'));// TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must be absolute
带有驱动器号的 file: URL 必须使用 : 作为驱动器号后面的分隔符。
使用其他分隔符会导致抛出错误。
在所有其他平台上,不支持带有主机名的 file: URL,使用时会导致抛出错误:
// 在其他平台上:// - 不支持带有主机名的 WHATWG 文件的 URL。// file://主机名/文件 => 抛出错误!fs.readFileSync(new URL('file://主机名/文件'));// TypeError [ERR_INVALID_FILE_URL_PATH]: must be absolute// - WHATWG 文件的 URL 会转换为绝对路径。// file:///文件 => /文件fs.readFileSync(new URL('file:///文件'));
包含编码后的斜杆字符的 file: URL 在所有平台上都会导致抛出错误:
// 在 Windows 上:fs.readFileSync(new URL('file:///C:/%2F'));fs.readFileSync(new URL('file:///C:/%2f'));/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded\ or / characters */// 在 POSIX 上:fs.readFileSync(new URL('file:///%2F'));fs.readFileSync(new URL('file:///%2f'));/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded/ characters */
在 Windows 上,包含编码后的反斜杆字符的 file: URL 会导致抛出错误:
// 在 Windows 上:fs.readFileSync(new URL('file:///C:/%5C'));fs.readFileSync(new URL('file:///C:/%5c'));/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded\ or / characters */
