nodejs入门教程20:nodejs文件系统
1. 引入fs模块
在Node.js中,你可以通过以下方式引入fs模块:
const fs = require('fs');
2. 文件操作
读取文件
- 异步读取:使用
fs.readFile()
方法。该方法接收文件路径和回调函数作为参数,回调函数在文件读取完成后被调用。
fs.readFile('example.txt', 'utf8', (err, data) => {if (err) throw err;console.log(data);
});
- 同步读取:使用
fs.readFileSync()
方法。该方法会阻塞程序直到文件读取完成。
try {const data = fs.readFileSync('example.txt', 'utf8');console.log(data);
} catch (err) {console.error('Error reading file:', err);
}
写入文件
- 异步写入:使用
fs.writeFile()
方法。该方法接收文件路径、要写入的内容和回调函数作为参数。
const content = 'Hello, World!';
fs.writeFile('example.txt', content, 'utf8', (err) => {if (err) throw err;console.log('File has been written successfully.');
});
- 同步写入:使用
fs.writeFileSync()
方法。该方法会阻塞程序直到文件写入完成。
const content = 'Hello, World!';
fs.writeFileSync('example.txt', content, 'utf8');
console.log('File has been written successfully.');
追加内容到文件
- 异步追加:使用
fs.appendFile()
方法。如果文件不存在,则会创建文件。
const additionalContent = '\nThis is additional content.';
fs.appendFile('example.txt', additionalContent, 'utf8', (err) => {if (err) throw err;console.log('Content has been appended successfully.');
});
- 同步追加:使用
fs.appendFileSync()
方法。
const additionalContent = '\nThis is additional content.';
fs.appendFileSync('example.txt', additionalContent, 'utf8');
console.log('Content has been appended successfully.');
3. 目录操作
创建目录
- 异步创建:使用
fs.mkdir()
方法。如果要创建多级目录,可以将recursive
选项设置为true
。
fs.mkdir('new_directory', { recursive: true }, (err) => {if (err) throw err;console.log('Directory created!');
});
- 同步创建:使用
fs.mkdirSync()
方法。
fs.mkdirSync('new_directory', { recursive: true });
console.log('Directory created!');
读取目录内容
- 异步读取:使用
fs.readdir()
方法。该方法返回目录中的文件和子目录名。
fs.readdir('directory_path', (err, files) => {if (err) throw err;console.log(files);
});
- 同步读取:使用
fs.readdirSync()
方法。
try {const files = fs.readdirSync('directory_path');console.log(files);
} catch (err) {console.error('Error reading directory:', err);
}
删除目录
- 异步删除:使用
fs.rmdir()
方法。该方法只能删除空目录。要删除非空目录,可以使用fs.rm()
方法并将recursive
选项设置为true
。
// 删除空目录
fs.rmdir('empty_directory', (err) => {if (err) throw err;console.log('Directory deleted!');
});// 删除非空目录
fs.rm('non_empty_directory', { recursive: true }, (err) => {if (err) throw err;console.log('Directory and its content deleted!');
});
- 同步删除:使用
fs.rmdirSync()
方法(仅适用于空目录)或fs.rmSync()
方法(可递归删除非空目录)。
// 删除空目录
fs.rmdirSync('empty_directory');
console.log('Directory deleted!');// 删除非空目录
fs.rmSync('non_empty_directory', { recursive: true });
console.log('Directory and its content deleted!');
4. 文件与目录的信息查询
- 检查文件或目录是否存在:使用
fs.access()
方法。该方法不会返回文件或目录的状态,而是根据提供的模式检查文件或目录是否存在。
fs.access('example.txt', fs.constants.F_OK, (err) => {if (err) {console.log('File does not exist!');} else {console.log('File exists!');}
});
- 获取文件信息:使用
fs.stat()
方法。该方法返回一个包含文件或目录状态的对象。
fs.stat('example.txt', (err, stats) => {if (err) throw err;console.log(`File size: ${stats.size} bytes`);console.log(`Creation time: ${stats.ctime}`);
});
- 获取目录内容:如上所述,使用
fs.readdir()
或fs.readdirSync()
方法。
5. 流式文件操作
对于大文件或需要逐步处理的文件,使用流式操作更加高效。Node.js提供了四种流:可读流(Readable)、可写流(Writable)、双向流(Duplex)和转换流(Transform)。
// 创建可读流
const readStream = fs.createReadStream('largeFile.txt', 'utf8');// 创建可写流
const writeStream = fs.createWriteStream('largeFileCopy.txt');// 使用管道将可读流连接到可写流
readStream.pipe(writeStream);// 处理流事件
readStream.on('data', (chunk) => {console.log(`Received ${chunk.length} bytes of data.`);
});readStream.on('end', () => {console.log('No more data in readable stream.');
});writeStream.on('finish', () => {console.log('Write completed.');
});
6. 注意事项
- 异步操作:Node.js的文件系统操作默认是异步的,这有助于保持应用的响应性。在可能的情况下,优先使用异步API。
- 错误处理:在进行文件系统操作时,务必处理可能发生的错误,以避免应用崩溃。
- 权限检查:在操作文件或目录之前,确保具有相应的权限。
- 路径操作:使用
path
模块来处理文件路径,以避免因路径问题导致的错误。
通过上述教程,你可以掌握Node.js文件系统的基本操作,从而在处理文件和目录时更加得心应手。