一、系统中的每个文件都有路径
1、在macOS上和Linux上,路径可能类似于:
/users/Amy/index.txt
2、在window上则有所不同,具有类似以下的结构:
C:\users\Amy\index.txt
当在应用程序中使用路径时需要注意,因为必须考虑到这种差异,可以使用如下方式将模块引入到文件中:
const path = require('path')
二、从路径中获取信息
1、给定一个路径,可以使用以下方法从其中提取信息:
a、dirname :获取文件的父文件夹
b、basename:获取文件名部分
c、extname:获取文件名的扩展名
示例:
const index= '/users/Amy/index.txt'
path.dirname(index) // /users/Amy
path.basename(index) // index.txt
path.extname(index) // .txt
可以通过为basename指定第二个参数来获取不带扩展名的文件名:
path.basename(index, path.extname(index)) //index
三、使用路径
可以使用path.join()连接路径的两个或多个片段
const name = 'Amy'
path.join('/', 'users', name, 'index.txt') // '/users/Amy/index.txt'
可以使用path.resolve()获得相对路径的绝对路径计算:
path.resolve('index.txt') //'/Users/Amy/index.txt'
如果从主文件夹运行。
在此示例中,Node.js只是简单地将/index.txt附加到当前工作目录。如果指定第二个文件夹参数,则resolve会使用第一个作为第二个的基础:
path.resolve('test', 'indx.txt') //'/Users/Amy/test/index.txt' 如果从主文件夹运行。
如果第一个参数以斜杠开头,则表示它是绝对路径:
path.resolve('/exam', 'index.txt') // '/exam/index.txt'
path.normailze()
是另一个有用的函数,当包含如下:‘.’ ‘、’ ‘...’ 或双斜杠之类的相对说明时,其会尝试计算实际的路径。
path.normalize('/users/Amy/..//index.txt') //'/users/index.txt'
解析和规范化都不会检查路径是否存在,其只是根据获得的信息来计算路径。
四、Node.js 文件操作
在Node.js中读取文件最简单的方式是使用fs.readFile()方法,向其传入文件路径、编码、以及会带上文件数据(以及错误)进行调用的回调函数:
const fs = require('fs')
fs.readFile('/Users/Amy/index.txt', 'utf8' , (err, data) => {
if (err) {
console.error(err)
return
}
console.log(data)
})
另外,也可以使用同步的版本 fs.readFileSync():
const fs = require('fs')
try {
const data = fs.readFileSync('/Users/Amy/index.txt', 'utf8')
console.log(data)
} catch (err) {
console.error(err)
}
fs.readFile()和fs.readFileSync()都会在返回数据之前将文件的全部内容读取到内存中。这意味着大文件会对内存的消耗和程序执行的速度产生重大的影响,那么在这种情况下,更好的选择是使用流(本阶段暂时不讲解)来读取文件的内容。
五、使用node.js写入文件
在node.js中写入文件最简单的方式是使用fs.writeFile() 示例:
const fs = require('fs')
const content = '今天天气很好'
fs.writeFile('/Users/Amy/index.txt', content, err => {
if (err) {
console.error(err)
return
}
//文件写入成功。
})
另外,还可以使用同步的版本fs.writeFileSync()
示例:
const fs = require('fs')
const content = '今天天气很好'
try {
const data = fs.writeFileSync('/Users/Amy/index.txt', content)
//文件写入成功。
} catch (err) {
console.error(err)
}
默认情况下,该API会替换文件的内容,(如果文件已经存在)可以通过指定标志来修改默认的行为:
示例:
fs.writeFile('/Users/Amy/index.txt', content, { flag: 'a+' }, err => {})
用的较多的标志有:
r+ 打开文件用于读写
w+打开文件用于读写,将流定位到文件的开头。如果文件不存在则创建文件
a 打开文件用于写入, 将流定位到文件的末尾。如果文件不存在则创建文件
a+打开文件用于读写, 将流定位到文件的末尾。如果文件不存在则创建文件
六、追加到文件
将内容追加到文件末尾的便捷方法是fs.appendFile() (及其对应的fs.appendFileSync())
const content = '今天天气很好'
fs.appendFile('file.log', content, err => {
if (err) {
console.error(err)
return
}
//完成!
})
所有这些方法都是在将全部内容写入文件之后才会将控制权返回给程序(在异步的版本中,这意味着执行回调)。在这种情况下,更好的选择是使用流。
今日份寄语:
没有人可以和生活讨价还价,所以只要活着,就一定要努力。