对于大多数 fs 模块的函数,pathfilename 参数可以传入 WHATWG [URL] 对象。 仅支持使用 file: 协议的 [URL] 对象。

    1. const fs = require('fs');
    2. const fileUrl = new URL('file:///文件');
    3. fs.readFileSync(fileUrl);

    file: URL 始终是绝对路径。

    使用 WHATWG [URL] 对象可能会采用特定于平台的行为。

    在 Windows 上,带有主机名的 file: URL 会转换为 UNC 路径,而带有驱动器号的 file: URL 会转换为本地的绝对路径。 没有主机名和驱动器号的 file: URL 会导致抛出错误:

    1. // 在 Windows 上:
    2. // - 带有主机名的 WHATWG 文件的 URL 会转换为 UNC 路径。
    3. // file://主机名/文件 => \\主机名\文件
    4. fs.readFileSync(new URL('file://主机名/文件'));
    5. // - 带有驱动器号的 WHATWG 文件的 URL 会转换为绝对路径。
    6. // file:///C:/文件 => C:\文件
    7. fs.readFileSync(new URL('file:///C:/文件'));
    8. // - 没有主机名的 WHATWG 文件的 URL 必须包含驱动器号。
    9. fs.readFileSync(new URL('file:///无驱动器号/文件'));
    10. fs.readFileSync(new URL('file:///文件'));
    11. // TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must be absolute

    带有驱动器号的 file: URL 必须使用 : 作为驱动器号后面的分隔符。 使用其他分隔符会导致抛出错误。

    在所有其他平台上,不支持带有主机名的 file: URL,使用时会导致抛出错误:

    1. // 在其他平台上:
    2. // - 不支持带有主机名的 WHATWG 文件的 URL。
    3. // file://主机名/文件 => 抛出错误!
    4. fs.readFileSync(new URL('file://主机名/文件'));
    5. // TypeError [ERR_INVALID_FILE_URL_PATH]: must be absolute
    6. // - WHATWG 文件的 URL 会转换为绝对路径。
    7. // file:///文件 => /文件
    8. fs.readFileSync(new URL('file:///文件'));

    包含编码后的斜杆字符的 file: URL 在所有平台上都会导致抛出错误:

    1. // 在 Windows 上:
    2. fs.readFileSync(new URL('file:///C:/%2F'));
    3. fs.readFileSync(new URL('file:///C:/%2f'));
    4. /* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
    5. \ or / characters */
    6. // 在 POSIX 上:
    7. fs.readFileSync(new URL('file:///%2F'));
    8. fs.readFileSync(new URL('file:///%2f'));
    9. /* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
    10. / characters */

    在 Windows 上,包含编码后的反斜杆字符的 file: URL 会导致抛出错误:

    1. // 在 Windows 上:
    2. fs.readFileSync(new URL('file:///C:/%5C'));
    3. fs.readFileSync(new URL('file:///C:/%5c'));
    4. /* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
    5. \ or / characters */