本文摘要:node中读取文件时的路径问题
我们在写读取文件的代码时,经常要用到 ' fs ' 模块的 readFile方法,该方法的第一个参数就是path。
例如:现在我们有一个文件a.txt,我们要读取这个文件(这个文件跟执行程序处于同一目录下)。
我们可能会用到下面这种方法:
var fs = require('fs')
fs.readFile('./a.txt','utf8',function (err, data) {
if (err) {
throw err
}
console.log(data)
})
在当前目录下,用 node app.js 执行当前程序。发现没有问题,输出正确
但是,当我们换一个目录再执行呢?此时,我们换到上一级目录下(One)。执行 node 路径问题\app.js,结果:
发现,这时,程序出现了问题。
查看出错日志,发现,程序到 One目录下,寻找 a.txt 。这显然是不对的,因为One是程序的上一层目录。
再换几个路径运行,我们不难发现,程序每次都会到当前目录下寻找a.txt。这是因为我们在写程序读取文件的时候,用了'./'路径。所以才会出现这种问题。
解决方法:
这时,我们可以通过Node中内置的属性 ' __dirname ' 和 ' __filename ' ,来代替 ' ./ '
例如,
console.log(__dirname)
console.log(__filename)
运行,输出:
可以发现,不管我们在哪里运行,这两个路径始终是不变的。他会自动获取当前程序的路径。所以,我们在写操作文件的程序的时候,可以这样写。
var fs = require('fs')
var path = require('path')
fs.readFile(path.join(__dirname, './a.txt'), 'utf8', function (err, data) {
if (err) {
throw err
}
console.log(data)
})
这样,不管我们在哪里执行,就算是换了操作系统,换了电脑,每次执行的时候 ' __dirname ' 都是动态获取的当前程序路径。
再配合 ' path ' 模块 的 ' path.join ' 方法,可以轻松的把路径合并。操作我们想操作的文件。
事实上,fs和path经常会同时出现。
注意:本文中说的是操作文件是的路径,而并不是引入模块的路径。
require('./b') 该方法,不受执行 node 命令所处路径影响