fs
fs模块是node内置的模块,操作文件或者文件夹的的读取和写入的
1. 文件系统操作(同步版本)
import {
mkdirSync, // 创建目录
readFileSync, // 读取文件
writeFileSync,// 写入文件
rmSync, // 删除文件或目录
readdirSync, // 读取目录内容
} from 'node:fs'
// 创建目录
mkdirSync('dist', { recursive: true }) // recursive: true 允许创建多级目录
// 读取文件
const content = readFileSync('package.json', 'utf-8') // 返回字符串
const buffer = readFileSync('image.png') // 返回 Buffer
// 写入文件
writeFileSync('dist/index.js', 'console.log("hello")')
writeFileSync('dist/data.json', JSON.stringify({ name: 'test' }))
// 删除文件或目录
rmSync('dist', {
force: true, // 强制删除
recursive: true // 递归删除目录
})
// 读取目录内容
const files = readdirSync('src') // 返回文件名数组
2. 文件系统操作(异步版本)
import {
mkdir,
readFile,
writeFile,
rm,
readdir,
} from 'node:fs/promises'
// 创建目录
await mkdir('dist', { recursive: true })
// 读取文件
const content = await readFile('package.json', 'utf-8')
// 写入文件
await writeFile('dist/index.js', 'console.log("hello")')
// 删除文件或目录
await rm('dist', { force: true, recursive: true })
// 读取目录内容
const files = await readdir('src')
3. 文件信息操作
import {
statSync, // 获取文件信息
accessSync, // 检查文件权限
existsSync, // 检查文件是否存在
} from 'node:fs'
// 获取文件信息
const stats = statSync('file.txt')
console.log({
isFile: stats.isFile(), // 是否是文件
isDirectory: stats.isDirectory(), // 是否是目录
size: stats.size, // 文件大小
createTime: stats.birthtime, // 创建时间
modifyTime: stats.mtime, // 修改时间
})
// 检查文件权限
try {
accessSync('file.txt', fs.constants.R_OK) // 检查是否可读
accessSync('file.txt', fs.constants.W_OK) // 检查是否可写
} catch (err) {
console.log('文件不可访问')
}
// 检查文件是否存在
if (existsSync('file.txt')) {
console.log('文件存在')
}
4. 文件流操作
import {
createReadStream,
createWriteStream,
} from 'node:fs'
// 读取大文件
const readStream = createReadStream('large-file.txt')
readStream.on('data', (chunk) => {
console.log('读取数据:', chunk)
})
// 写入大文件
const writeStream = createWriteStream('output.txt')
writeStream.write('Hello World')
writeStream.end()
5. 文件路径操作
import {
join, // 连接路径
resolve, // 解析绝对路径
dirname, // 获取目录名
basename, // 获取文件名
extname, // 获取扩展名
} from 'node:path'
// 路径连接
const path = join('src', 'components', 'index.ts')
// 解析绝对路径
const absolutePath = resolve('src', 'index.ts')
// 获取目录名
const dir = dirname('/path/to/file.txt') // '/path/to'
// 获取文件名
const file = basename('/path/to/file.txt') // 'file.txt'
// 获取扩展名
const ext = extname('file.txt') // '.txt'
6. 文件监听
import { watch } from 'node:fs'
// 监听文件变化
watch('file.txt', (eventType, filename) => {
console.log('文件变化:', eventType, filename)
})
// 监听目录变化
watch('src', { recursive: true }, (eventType, filename) => {
console.log('目录变化:', eventType, filename)
})
7. 文件复制和移动
import {
copyFileSync,
renameSync,
} from 'node:fs'
// 复制文件
copyFileSync('source.txt', 'target.txt')
// 移动文件
renameSync('old.txt', 'new.txt')
8. 文件权限操作
import {
chmodSync,
chownSync,
} from 'node:fs'
// 修改文件权限
chmodSync('file.txt', 0o755) // 设置可执行权限
// 修改文件所有者
chownSync('file.txt', 1000, 1000) // 用户ID和组ID
9. 临时文件操作
import {
mkdtempSync,
writeFileSync,
} from 'node:fs'
import { join } from 'node:path'
// 创建临时目录
const tempDir = mkdtempSync(join(os.tmpdir(), 'prefix-'))
// 创建临时文件
const tempFile = join(tempDir, 'temp.txt')
writeFileSync(tempFile, '临时内容')
10. 最佳实践
// 1. 使用异步版本
import { promises as fs } from 'node:fs'
// 2. 错误处理
try {
await fs.readFile('file.txt', 'utf-8')
} catch (err) {
console.error('读取文件失败:', err)
}
// 3. 使用流处理大文件
const readStream = createReadStream('large-file.txt')
const writeStream = createWriteStream('output.txt')
readStream.pipe(writeStream)
// 4. 使用 path 模块处理路径
import { join } from 'node:path'
const filePath = join(__dirname, 'file.txt')