
3.2 打开与关闭文件
其实,在Node程序中管理一个文件,最简单、最常用的就是打开文件和关闭文件这两个操作。文件系统fs模块中提供了fs.open()与fs.openSync()两个方法来完成打开文件的操作,相应地提供了fs.close()与fs.closeSync()两个方法来完成关闭文件的操作。
下面我们分别通过同步方式打开文件和异步方式打开文件进行介绍。
1. 同步方式打开文件
以同步方式打开和关闭文件需要使用fs.openSync()方法和fs.closeSync()方法进行操作。下面是一个以同步方式打开文件的代码实例。
【代码3-1】(详见源代码目录ch03-node-fs-open-sync.js文件)

【代码分析】
• 为了测试文件打开与关闭的操作,先在代码文件目录下新建一个“txt”子目录,然后在该子目录中创建一个名称为“openSync.txt”的文本文件。
• 第07~19行代码主要用于参看文本文件的内容,其中第11~18行使用exec()方法打印输出了“openSync.txt”文本文件的内容;另外,这段代码中使用到的功能模块会在后续章节中详细介绍,读者可先忽略。
• 第24行代码通过require()指令引用了文件系统fs模块。
• 第25行代码和第29行代码分别通过fs.openSync()与fs.closeSync()方法执行了文件打开与文件关闭的操作;同时,通过这两个方法的返回值获取了文本文件的文件描述符(fd)参数信息。
单击工具栏中的“运行(Run)”命令按钮,通过“运行、调试和控制台输出”查看信息输出,如图3.1所示。

图3.1 打开与关闭文件的方法(同步方式)
如图3.1所示,通过fs.openSync()方法与fs.closeSync()方法进行文件打开与文件关闭(同步版本)的操作均获得了成功,同时还获取了文件描述符参数信息(本例为数值3)。
2. 异步方式打开文件
上面介绍的是同步方式打开文件的方法,下面接着向读者介绍异步方式打开文件的方法。异步方式打开文件和关闭文件需要使用fs.open()方法和fs.close()方法进行操作。下面看一个以异步方式打开文件的代码实例。
【代码3-2】(详见源代码目录ch03-node-fs-open-async.js文件)

【代码分析】
• 为了测试以异步方式打开与关闭文件的操作,继续在之前创建的“txt”子目录中创建一个名称为“open.txt”的文本文件。
• 第23行代码通过require()指令引用了文件系统fs模块。
• 第27行代码通过fs.open()方法执行了异步方式打开文件的操作,其中参数a表示以追加方式打开文件,如果文件不存在,就创建一个空文件;而第27~40行代码定义了fs.open()方法的回调函数,参数fd为文件描述符。
• 因为fs.open()方法是以异步方式打开文件的,所以关闭文件的操作定义在了该回调函数中,具体就是在第35~39行代码中,通过fs.close()方法执行了以异步方式关闭文件的操作。
单击工具栏中的“运行(Run)”命令按钮,通过“运行、调试和控制台输出”查看信息输出,如图3.2所示。

图3.2 打开与关闭文件的方法(异步版本)
如图3.2所示,通过fs.open()方法与fs.close()方法进行文件打开与关闭(异步版本)操作均获得了成功,同时还获取了文件描述符参数信息(本例为数值3)。
另外,对于操作系统内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数,当打开一个现有文件或创建一个新文件时,内核向进程返回文件描述符信息。