Node. js对应文件处理的能力,主要由fs模块来提供。fs模块提供了一组API,用于以模仿标准UNIX(POSIX)函数的方式与文件系统进行交互。
使用fs模块的方式如下。
所有文件系统操作都具有同步和异步的形式。
异步的形式总是将完成回调作为其最后一个参数。传给完成回调的参数取决于具体方法,但第一个参数始终预留用于异常。如果操作成功完成,则第一个参数将为null或undefined。以下是一个异常操作文件系统的示例。
使用同步的操作发生的异常会立即抛出,可以使用try/catch处理,也可以允许冒泡。以下是一个同步操作文件系统的示例。
使用异步的方法时无法保证顺序。因此,以下的操作容易出错,因为fs.stat()操作可能在fs.rename()操作之前完成。
要正确地排序这些操作,则将fs.stat()调用移动到fs.rename()操作的回调中。
在繁忙的进程中,强烈建议使用这些调用的异步版本。同步的版本将阻塞整个进程,直到它们完成(停止所有连接)。
虽然不推荐这样使用,但大多数fs函数允许省略回调参数,在这种情况下,使用一个会重新抛出错误的默认回调。要获取原始调用点的跟踪,则设置NODE_DEBUG环境变量。
不推荐在异步的fs函数上省略回调函数,因为可能导致将来抛出错误。
在POSIX系统上,对于每个进程,内核都维护着一张当前打开着的文件和资源的表格。每个打开的文件都分配了一个称为文件描述符(file descriptor)的简单的数字标识符。在系统层,所有文件系统操作都使用这些文件描述符来标识和跟踪每个特定的文件。Windows系统使用了一个虽然不同但概念上类似的机制来跟踪资源。为了简化用户的工作,Node.js抽象出操作系统之间的特定差异,并为所有打开的文件分配一个数字型的文件描述符。
fs. open()方法用于分配新的文件描述符。一旦被分配,则文件描述符可用于从文件读取数据、向文件写入数据或请求关于文件的信息。以下是示例。
大多数操作系统限制在任何给定时间内可能打开的文件描述符的数量,因此当操作完成时关闭描述符至关重要。如果不这样做将导致内存泄漏,甚至最终导致应用程序崩溃。