NAE 对当前目录的读取结果 '.' 和 __dirname+'/' 是不同的?
发布于 13 年前 作者 jiyinyiyong 5640 次浏览 最后一次编辑是 8 年前

改了个应用 http://docview.cnodejs.net/, 部署时候被目录问题折腾几个小时
我要用 fs.readdir 读取当前目录返回网页, 子目录都没问题了, 根目录解不出来
中间因为 console.logthrow Error 都看不到… 绕来绕去用页面把结果返回来
最后发现有这个奇怪的东西, 难道是版本的原因吗? 还是触犯了什么限制?
新建了一个测试的, 代码如下:

(require('http')).createServer(function(req, res) {
  require('fs').readdir('.', function(err, list) {
    res.write(String(err)+'\n');
    res.write(String(list)+'\n');
    res.write(String(require('path').existsSync('.')));
    return res.end();
  });
}).listen(80);

返回的结果是

Error: ENOENT, No such file or directory '.'
undefined
true

目录换成了 __dirname+'/'

null
package.json,.nae.tmp,config.js,t,.naeindex,server.js
true

目录换成 __dirname

Error: ENOENT, No such file or directory '/home/admin/cnae/git/cnode-app-engine/apps_online/readdir'
undefined
true
5 回复

不要用 . ,要么用 process.cwd() 要么 __dirname, cwd代表当前工作目录, __dirname代表当前文件目录, __dirname不是一个global,而是每个文件私有.

http://nodejs.org/api/globals.html#globals_dirname

原来是这样. 我真是全忘光了. 不过这边我还是有点糊涂, 再问下
__dirname__dirname/ 的区别是什么? 为什么结果不一样的.
'.' 就算不是当前位置, 至少是指向某个目录吧, 为什么提示没有呢?

__dirname 后面好像是没有 ‘/’

比如

var uploadRoot = __dirname; var filename = uploadRoot + 'abc.png’ 那filename将会是 /var/www/approotabc.png 但我们希望的是 /var/www/approot/abc.png 所以就写成 var uploadRoot = __dirname + ‘/’; var filename = uploadRoot + 'abc.png’ 这样就算是多了个 ‘/’, 也会是 /var/www/approot//abc.png 同样合法. 算是一种编码习惯吧.

另外关于.为什么会提示没有的问题, 个人猜测可能是没有读权限导致的.

这个的大概用 path.join 更好点

回到顶部