fs模块
使用如下代码引入fs模块:
const fs = require('fs')
比较常见的就是使用utf8编码读取文件,返回字符串,例如:
const content = fs.readFileSync('file.txt', 'utf8')
console.log(content)
当然还有fs.readFile()和fs.promise.readFile()这两种异步读取方式,还有更低级的read()方法,这几种方式的代码更复杂一些。对于大部分数据量不大的文本文件,只需要使用readFileSync()这种同步方式即可。
要写入文件内容,使用writeFileSync()方法:
fs.writeFileSync('file.txt', 'some content', 'utf8')
与读取文件类似,写文件操作也有对应的异步方法和低级API,大部分情况下使用同步方式即可。
要追加文件内容,使用appendFileSync()方法:
fs.appendFileSync('file.txt','new content','utf8')
要复制文件,使用copyFileSync()方法:
fs.copyFileSync('old.txt' , 'new.txt')
fs.copyFileSync('old.txt' , 'new.txt')
要删除文件,使用rmSync()方法,如下命令删除当前工作目录下的old.txt文件:
fs.rmSync('old.txt')
要重命名文件,使用renameSync()方法,例如:
fs.renameSync('old.txt','new.txt') // 重命名
值得一提的是,移动文件的本质也是重命名文件——对文件的路径进行重命名,fs模块并没有类似moveSync()的方法,仍然是使用renameSync()以重命名路径的方式完成文件的移动,如下示例将old.txt移动到文件夹dir下:
fs.renameSync('old.txt','dir/old.txt')
如下示例移动且重命名文件:
fs.renameSync('old.txt','dir/new.txt')
fs.readDirSync()方法用于列举文件或目录下的文件列表,类似于ls命令,如下示例读取当前目录下的文件列表:
console.log(fs.readdirSync('.'))
这会输出一个由字符串组成的数组,每个元素就是文件或目录名。
使用mkdirSync()新建目录,使用rmdirSync()删除目录,例如:
fs.mkdirSync('newdir')
fs.rmdirSync('newdir')
注意,如果目录已经存在,则会报错。
existsSync()方法检查文件或目录是否存在,传入相对或绝对路径:
console.log(fs.existsSync('file.txt')) // 检查文件是否存在
console.log(fs.existsSync('dir')) // 检查目录是否存在
fs.statSync()返回文件或目录的属性,包括修改时间、创建时间、文件大小等元数据。
console.log(fs.statSync('file.txt'))
path模块
使用如下代码引入fs模块:
const fs = require('path')
下面列出了一些常用的路径:
- process.cwd() 当前工作目录的绝对路径。
- __filename 当前代码文件的绝对路径。
- __dirname 当前代码文件所在目录的绝对路径。
- os.homedir() 家目录,需要先引入os模块。
- path.sep /或\,取决于操作系统。
如下是使用path模块进行路径解析的示例代码:
const p = "D:\\Test\\example.js"
console.log(path.basename(p)) // example.js,含后缀的文件名
console.log(path.extname(p)) // .js , 后缀名
console.log(path.basename(p, path.extname(p))) // example,不含后缀的文件名
console.log(path.dirname(p)) // D:\Test ,所在目录
path.join()用于组合多个路径,它会自己处理路径中存在的’/‘、’//‘、’…'。
console.log(path.join('a','//b','./c')) // a\b\c
// 自动解析相对路径符号
console.log(path.join('a', '.', 'b', '..', 'c')) // a\c
path.normalize()规范化路径为当前操作系统的格式。
console.log(path.normalize('a/b/c')) // a\b\c
'/foo/bar/baz/asdf'
console.log(path.normalize('/foo/bar//baz/asdf/quux/..')) // '/foo/bar/baz/asdf'
path.resolve()从最后一个路径开始,反向处理。
path.resolve('/foo/bar', './baz') // returns '/foo/bar/baz'
path.resolve('/foo/bar', 'baz') // returns '/foo/bar/baz'
path.resolve('/foo/bar', '/baz') // returns '/baz'
path.resolve('/foo/bar', '../baz') // returns '/foo/baz'
path.resolve('home','/foo/bar', '../baz') // returns '/foo/baz'
path.resolve('home','./foo/bar', '../baz') // returns '/home/foo/baz'
path.resolve('home','foo/bar', '../baz') // returns '/home/foo/baz'
path.resolve('home', 'foo', 'build','aaaa','aadada','../../..', 'asset') //return '/home/foo/asset'