即使路径正确,也无法在 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
,你可以读取.dburl
和readFileSync('./dburl')
。但是,如果您运行cd foo/bar; node ./script
,则需要阅读.dburl
和readFileSync('../../.dburl')
。
这是因为您的脚本的工作目录与您启动它的 shell 的工作目录相同。
【讨论】:
那么相对文件路径是相对于shell的工作目录而不是脚本的位置? 至少在节点上下文中? @srpalo 是的。尝试将console.log(process.cwd())
添加到您的脚本中,它将打印您的所有 fs 路径都相对的目录。 require
调用是相对于脚本路径的。
process.cwd() 的输出是脚本所在的文件路径。如果这是真的,那么 ../../.dburl 不应该是正确的,因为我是相对于脚本位置创建它的?
在运行脚本之前,运行ls ../../.dburl
。如果它说“没有这样的文件或目录”,您的脚本将无法找到它。以上是关于即使路径正确,也无法在 Node 中找到文件的主要内容,如果未能解决你的问题,请参考以下文章
为啥即使在搜索路径中列出了 GLEW 动态库,Xcode 也无法找到它?
npm : 无法将“npm”项识别为 cmdlet函数脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。