【问题标题】:Cannot find file in Node even though it has correct path即使路径正确,也无法在 Node 中找到文件
【发布时间】:2017-05-26 21:43:10
【问题描述】:

执行此代码后:

const filename = "../../.dburl"
const url = fs.readFileSync(filename, 'utf-8')

我收到以下错误:

Error: ENOENT: no such file or directory, open '../../.dburl'

到目前为止我所知道的:

1) 文件路径正确。

2) 我的应用程序有权读取该文件。

3) .dburl 即使存储在与应用程序相同的目录中也不会被读取。

非常感谢任何帮助...谢谢!

【问题讨论】:

  • 您确定.dburl 的路径与您运行脚本的位置相关吗?路径相对的当前工作目录不是进行readFileSync 调用的脚本的位置。

标签: node.js fs


【解决方案1】:

您可以使用模块级变量“__dirname”来获取包含当前脚本的目录。然后你可以使用 path.resolve 来使用相对路径。

console.log('Path of file in parent dir:', require('path').resolve(__dirname, '../app.js'));

【讨论】:

    【解决方案2】:

    在同一级别读取文件

     //the server object listens on port 8080
        const PORT = 8080;
        var http = require("http");
        var fs = require("fs");
        var path = require("path");
    
        //create a server object:
        http
          .createServer((req, res) => {
            console.log("READING FILE: ", path.resolve(__dirname, "input.txt"));
    
            fs.readFile(path.resolve(__dirname, "input.txt"), (err, data) => {
              //error handling
              if (err) return console.error(err);
    
              //return file content
              console.log("FILE CONTENT: " + data.toString());
              res.write(data.toString());
              res.end();
              console.log("READ COMPLETED");
            });
          })
          .listen(PORT);
    

    阅读其他级别的文件:

    //the server object listens on port 8080
    const PORT = 8080;
    var http = require("http");
    var fs = require("fs");
    var path = require("path");
    
    //create a server object:
    http
      .createServer((req, res) => {
        console.log("READING FILE: ", path.resolve(__dirname, "./mock/input.txt"));
    
        fs.readFile(path.resolve(__dirname, "./mock/input.txt"), (err, data) => {
          //error handling
          if (err) return console.error(err);
    
          //return file content
          console.log("FILE CONTENT: " + data.toString());
          res.write(data.toString());
          res.end();
          console.log("READ COMPLETED");
        });
      })
      .listen(PORT);
    

    【讨论】:

      【解决方案3】:

      我猜您将脚本的当前工作目录与脚本的位置混淆了。如果不知道项目的结构以及从哪里调用脚本,就很难说。

      假设你的shell的工作目录是/.dburl/.dburl,你的脚本是/foo/bar/script.js。如果你运行node foo/bar/script,你可以读取.dburlreadFileSync('./dburl')。但是,如果您运行cd foo/bar; node ./script,则需要阅读.dburlreadFileSync('../../.dburl')

      这是因为您的脚本的工作目录与您启动它的 shell 的工作目录相同。

      【讨论】:

      • 那么相对文件路径是相对于shell的工作目录而不是脚本的位置?
      • 至少在节点上下文中?
      • @srpalo 是的。尝试将console.log(process.cwd()) 添加到您的脚本中,它将打印您的所有 fs 路径都相对的目录。 require 调用是相对于脚本路径的。
      • process.cwd() 的输出是脚本所在的文件路径。如果这是真的,那么 ../../.dburl 不应该是正确的,因为我是相对于脚本位置创建它的?
      • 在运行脚本之前,运行ls ../../.dburl。如果它说“没有这样的文件或目录”,您的脚本将无法找到它。
      猜你喜欢
      • 2021-08-13
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      相关资源
      最近更新 更多