Node.js 文件与目录的操作

在Node.js中,文件与目录的操作是一个非常重要的部分,尤其是在构建服务器、处理数据和文件上传下载等场景中。Node.js提供了fs(文件系统)模块来处理文件和目录的操作。本文将详细介绍如何使用fs模块进行文件与目录的操作,包括读取、写入、删除、重命名等操作,并提供丰富的示例代码。

1. 引入fs模块

在开始之前,我们需要引入Node.js的fs模块。可以通过以下方式引入:

const fs = require('fs');

2. 文件操作

2.1 读取文件

2.1.1 异步读取

使用fs.readFile方法可以异步读取文件内容。该方法接受文件路径和回调函数作为参数。

fs.readFile('example.txt', 'utf8', (err, data) => {
    if (err) {
        console.error('Error reading file:', err);
        return;
    }
    console.log('File content:', data);
});

优点

  • 非阻塞:不会阻塞事件循环,适合处理大量文件读取。

缺点

  • 需要处理回调函数,可能导致回调地狱。

注意事项

  • 确保文件路径正确,文件存在,否则会返回错误。

2.1.2 同步读取

使用fs.readFileSync方法可以同步读取文件内容。

try {
    const data = fs.readFileSync('example.txt', 'utf8');
    console.log('File content:', data);
} catch (err) {
    console.error('Error reading file:', err);
}

优点

  • 代码简单,易于理解。

缺点

  • 阻塞:在读取文件时会阻塞事件循环,影响性能。

注意事项

  • 适合在初始化阶段读取配置文件等小文件。

2.2 写入文件

2.2.1 异步写入

使用fs.writeFile方法可以异步写入文件。

const content = 'Hello, Node.js!';
fs.writeFile('output.txt', content, (err) => {
    if (err) {
        console.error('Error writing file:', err);
        return;
    }
    console.log('File written successfully');
});

优点

  • 非阻塞,适合高并发场景。

缺点

  • 需要处理回调,可能导致代码复杂。

注意事项

  • 如果文件已存在,writeFile会覆盖原文件。

2.2.2 同步写入

使用fs.writeFileSync方法可以同步写入文件。

try {
    fs.writeFileSync('output.txt', content);
    console.log('File written successfully');
} catch (err) {
    console.error('Error writing file:', err);
}

优点

  • 代码简单,易于理解。

缺点

  • 阻塞,影响性能。

注意事项

  • 同样会覆盖已存在的文件。

2.3 删除文件

使用fs.unlink方法可以删除文件。

fs.unlink('output.txt', (err) => {
    if (err) {
        console.error('Error deleting file:', err);
        return;
    }
    console.log('File deleted successfully');
});

优点

  • 简单易用。

缺点

  • 需要处理回调。

注意事项

  • 确保文件存在,否则会返回错误。

2.4 重命名文件

使用fs.rename方法可以重命名文件。

fs.rename('example.txt', 'new_example.txt', (err) => {
    if (err) {
        console.error('Error renaming file:', err);
        return;
    }
    console.log('File renamed successfully');
});

优点

  • 直接重命名,操作简单。

缺点

  • 需要处理回调。

注意事项

  • 确保目标文件名不冲突。

3. 目录操作

3.1 创建目录

使用fs.mkdir方法可以创建目录。

fs.mkdir('new_directory', { recursive: true }, (err) => {
    if (err) {
        console.error('Error creating directory:', err);
        return;
    }
    console.log('Directory created successfully');
});

优点

  • 支持递归创建目录。

缺点

  • 需要处理回调。

注意事项

  • 如果目录已存在,且不使用recursive选项,会返回错误。

3.2 读取目录

使用fs.readdir方法可以读取目录中的文件和子目录。

fs.readdir('new_directory', (err, files) => {
    if (err) {
        console.error('Error reading directory:', err);
        return;
    }
    console.log('Directory contents:', files);
});

优点

  • 可以获取目录下所有文件和子目录。

缺点

  • 需要处理回调。

注意事项

  • 返回的文件名不包含路径。

3.3 删除目录

使用fs.rmdir方法可以删除空目录。

fs.rmdir('new_directory', (err) => {
    if (err) {
        console.error('Error deleting directory:', err);
        return;
    }
    console.log('Directory deleted successfully');
});

优点

  • 简单易用。

缺点

  • 只能删除空目录。

注意事项

  • 如果目录不为空,删除会失败。

4. 总结

Node.js的fs模块提供了丰富的文件与目录操作功能,适合各种场景。通过异步和同步的方式,我们可以灵活地处理文件和目录。虽然异步操作更适合高并发场景,但在某些情况下,简单的同步操作也能提高代码的可读性。

在使用fs模块时,务必注意错误处理,确保文件和目录的存在性,以避免不必要的错误。希望本文能帮助你更好地理解Node.js中的文件与目录操作。