当前位置 博文首页 > jcLee95的博客:Nodejs 文件 与 路径 相关用法实例解析

    jcLee95的博客:Nodejs 文件 与 路径 相关用法实例解析

    作者:[db:作者] 时间:2021-09-18 15:45

    Nodejs 文件 与 路径 相关用法

    CSDN用户名:jcLee95

    邮箱:291148484@163.com

    原创不易,感谢点赞支持。


    1.路径

    (1)引入path模块

    const path = require('path');
    

    (2)当前文件所在目录的绝对路径:__dirname

    console.log("__dirname =",__dirname);
    
    __dirname = g:\NodeJs\fs
    

    (3)路径连接:path.join()

    path.join() 方法使用特定于平台的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径。

    • 零长度的 path 片段被忽略;
    • 如果连接的路径字符串是零长度字符串,则将返回 ‘.’,表示当前工作目录。
    const joined_path = path.join(__dirname, 'NodeJs', 'textFile.txt')
    console.log(joined_path);
    
    g:\NodeJs\fs\NodeJs\textFile.txt
    

    (4)获取文件名:path.basename()

    const filename = path.basename('g:\\NodeJs\\fs\\NodeJs\\textFile.txt')
    console.log(filename);
    
    textFile.txt
    

    (5)获取文件扩展名:path.extname()

    const surfix = path.extname('g:\\NodeJs\\fs\\NodeJs\\textFile.txt')
    console.log(surfix);
    
    .txt
    

    (6)分解绝对路径:path.parse()

    • root: 根目录/ 磁盘名
    • dir: 文件或文件夹所在文件夹完整绝对路径
    • base: 文件/文件夹名加扩展(非绝对路径)
    • ext: 扩展名
    • name: 文件/文件夹名
    const parserst = path.parse('g:\\NodeJs\\fs\\NodeJs\\textFile.txt')
    console.log(parserst);console.log();
    
    {
      root: 'g:\\',
      dir: 'g:\\NodeJs\\fs\\NodeJs',
      base: 'textFile.txt',
      ext: '.txt',
      name: 'textFile'
    }
    

    (7)从对象返回路径字符串:path.format()

    path.parse()功能相反

    const pt = path.format({
      root: 'g:\\',
      dir: 'g:\\NodeJs\\fs\\NodeJs',
      base: 'textFile.txt'
    });
    console.log(pt);
    
    g:\NodeJs\fs\NodeJs\textFile.txt
    

    (8)判断是否是绝对路径:path.isAbsolute()

    const isAbs1 = path.isAbsolute('g:\\NodeJs\\fs\\NodeJs\\textFile.txt');
    const isAbs2 = path.isAbsolute('textFile.txt');
    console.log('isAbs1是绝对路径吗:',isAbs1);
    console.log('isAbs2是绝对路径吗:',isAbs2);
    
    isAbs1是绝对路径吗: true
    isAbs2是绝对路径吗: false
    

    (9)返回两端路径之间的相对路径表示:path.relative()

    const path1 = '/data/orandea/test/aaa';
    const path2 = '/data/orandea/impl/bbb';
    const relativepath = path.relative(path1,path2)
    console.log('path2在path1的相对表示为:',relativepath);console.log();
    
    path2在path1的相对表示为: ..\..\impl\bbb
    

    (10)将路径或路径片段的序列解析为绝对路径:path.resolve()

    // 给定的路径序列从右到左处理,每个后续的 path 会被追加到前面,直到构建绝对路径。
    console.log(path.resolve('/foo/bar', '/tmp/file/'));
    console.log(path.resolve('NodeJs', 'fs/NodeJs/', 'textFile'));
    
    G:\tmp\file
    G:\NodeJs\NodeJs\fs\NodeJs\textFile
    

    (11)将路径分割为数组:path.sep

    (注意与不同系统的路径分隔符有关)

    console.log('foo\\bar\\baz'.split(path.sep));console.log();
    
    [ 'foo', 'bar', 'baz' ]
    

    注意区分不同系统上的路径分隔符不同。

    (12)获取当前操作系统上的路径定界符:path.delimiter

    console.log('路径定界符为:',path.delimiter);
    
    路径定界符为: ;
    

    应用

    const processEnvPATH = process.env.PATH
    console.log(processEnvPATH);
    console.log(processEnvPATH.split(path.delimiter));console.log();
    
    C:\Program Files\PowerShell\7;C:\Program Files\AdoptOpenJDK\jdk-11.0.8.10-hotspot\bin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Program Files\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\PowerShell\7\;D:\Program Files\Dart\dart-sdk\bin;C:\Program Files\PuTTY\;D:\Program Files\nodejs\;C:\ProgramData\chocolatey\bin;C:\Program Files (x86)\Yarn\bin\;C:\Program Files\Docker\Docker\resources\bin;C:\ProgramData\DockerDesktop\version-bin;C:\Program Files\dotnet\;C:\Program Files\Git\cmd;C:\Program Files\MySQL\MySQL Shell 8.0\bin\;C:\Users\a2911\AppData\Local\Programs\Python\Python39\Scripts\;C:\Users\a2911\AppData\Local\Programs\Python\Python39\;C:\Users\a2911\AppData\Local\Microsoft\WindowsApps;D:\flutter;C:\Users\a2911\AppData\Local\GitHubDesktop\bin;C:\Users\a2911\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\a2911\AppData\Local\Yarn\bin;D:\flutter\bin;C:\Users\a2911\.dotnet\tools;D:\Program Files\Nox\bin;C:\Users\a2911\AppData\Roaming\npm;
    [
      'C:\\Program Files\\PowerShell\\7',
      'C:\\Program Files\\AdoptOpenJDK\\jdk-11.0.8.10-hotspot\\bin',
      'C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath',
      'C:\\Program Files\\Common Files\\Oracle\\Java\\javapath',
      'C:\\WINDOWS\\system32',
      'C:\\WINDOWS',
      'C:\\WINDOWS\\System32\\Wbem',
      'C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\',
      'C:\\WINDOWS\\System32\\OpenSSH\\',
      'C:\\Program Files\\PowerShell\\7\\',
      'D:\\Program Files\\Dart\\dart-sdk\\bin',
      'C:\\Program Files\\PuTTY\\',
      'D:\\Program Files\\nodejs\\',
      'C:\\ProgramData\\chocolatey\\bin',
      'C:\\Program Files (x86)\\Yarn\\bin\\',
      'C:\\Program Files\\Docker\\Docker\\resources\\bin',
      'C:\\ProgramData\\DockerDesktop\\version-bin',
      'C:\\Program Files\\dotnet\\',
      'C:\\Program Files\\Git\\cmd',
      'C:\\Program Files\\MySQL\\MySQL Shell 8.0\\bin\\',
      'C:\\Users\\a2911\\AppData\\Local\\Programs\\Python\\Python39\\Scripts\\',
      'C:\\Users\\a2911\\AppData\\Local\\Programs\\Python\\Python39\\',
      'C:\\Users\\a2911\\AppData\\Local\\Microsoft\\WindowsApps',
      'D:\\flutter',
      'C:\\Users\\a2911\\AppData\\Local\\GitHubDesktop\\bin',
      'C:\\Users\\a2911\\AppData\\Local\\Programs\\Microsoft VS Code\\bin',
      'C:\\Users\\a2911\\AppData\\Local\\Yarn\\bin',
      'D:\\flutter\\bin',
      'C:\\Users\\a2911\\.dotnet\\tools',
      'D:\\Program Files\\Nox\\bin',
      'C:\\Users\\a2911\\AppData\\Roaming\\npm',
      ''
    ]
    

    (13)返回所在文件夹绝对路径:path.dirname()

    const dir = path.dirname('g:\\NodeJs\\fs\\NodeJs\\textFile.txt');
    console.log(dir);
    
    g:\NodeJs\fs\NodeJs
    

    2. 文件

    (1)引入相关模块

    const path = require('path');
    

    (2)异步地获取指定文件的相关信息:access()

    const file = 'g:\\NodeJs\\textFile.txt';
    // 检查当前目录中是否存在该文件。
    fs.access(file, fs.constants.F_OK, (err) => {
      console.log(`${file} ${err ? '不存在' : '存在'}`);
    });
    
    // 检查文件是否可读。
    fs.access(file, fs.constants.R_OK, (err) => {
      console.log(`${file} ${err ? '不可读' : '可读'}`);
    });
    
    // 检查文件是否可写。
    fs.access(file, fs.constants.W_OK, (err) => {
      console.log(`${file} ${err ? '不可写' : '可写'}`);
    });
    
    // 检查当前目录中是否存在文件,是否可写。
    fs.access(file, fs.constants.F_OK | fs.constants.W_OK, (err) => {
      if (err) {
        console.error(
          `${file} ${err.code === 'ENOENT' ? '不存在' : '是 只读文件'}`);
      } else {
        console.log(`${file} 存在, 并且它是可写的`);
      }
    });
    
    g:\NodeJs\textFile.txt 存在
    g:\NodeJs\textFile.txt 可读
    g:\NodeJs\textFile.txt 可写
    g:\NodeJs\textFile.txt 存在, 并且它是可写的
    

    (3)复制文件(自动创建或覆盖目标):copyFile()

    let sourceFile = 'g:\\NodeJs\\textfile.txt';
    let destinationFile = 'g:\\NodeJs\\textfile.txt';
    
    // 定义复制操作后执行的回调函数
    function callBack(err) {
      if (err) {throw err}
      else{
        console.log('文件顺利复制完成');
      };
    }
    
    fs.copyFile(sourceFile, destinationFile, callBack);
    
    文件顺利复制完成
    

    (4)复制文件(文件存在则报错):fs.constants.COPYFILE_EXCL

    let sourceFile = 'g:\\NodeJs\\textfile.txt';
    let destinationFile = 'g:\\NodeJs\\textfile.txt';
    
    function callBack(err) {
      if (err) throw err;
      console.log('文件顺利复制完成');
    }
    
    fs.copyFile(sourceFile, destinationFile, fs.constants.COPYFILE_EXCL, callBack);
    
    [Error: EEXIST: file already exists, copyfile 'g:\NodeJs\textfile.txt' -> 'g:\NodeJs\textfile.txt'] {
      errno: -4075,
      code: 'EEXIST',
      syscall: 'copyfile',
      path: 'g:\\NodeJs\\textfile.txt',
      dest: 'g:\\NodeJs\\textfile.txt'
    }