fs

96 阅读2分钟

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')