即使路径正确,也无法在 Node 中找到文件

Posted

技术标签:

【中文标题】即使路径正确,也无法在 Node 中找到文件【英文标题】:Cannot find file in Node even though it has correct path 【发布时间】: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 调用的脚本的位置。 【参考方案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。如果它说“没有这样的文件或目录”,您的脚本将无法找到它。

以上是关于即使路径正确,也无法在 Node 中找到文件的主要内容,如果未能解决你的问题,请参考以下文章

即使我正确设置了路径,React 也没有找到模块

即使定义了搜索路径,也无法找到自定义共享库

为啥即使在搜索路径中列出了 GLEW 动态库,Xcode 也无法找到它?

AVD 管理器错误:“无法找到 adb”

获取内容:无法找到路径

npm : 无法将“npm”项识别为 cmdlet函数脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。