从文件异步读取
对所有文件操作使用文件系统模块:
|
|
Encoding
在这个例子中,从目录/ tmp
中读取hello.txt
。 此操作将在后台完成,并且在完成或失败时发生回调:
|
|
Without Encoding
从当前目录中读取二进制文件binary.txt
,在后台异步读取。 请注意,我们不设置’encoding’选项 - 这样可以防止Node.js将内容解码为字符串:
|
|
相对路径
请记住,在一般情况下,您的脚本可以使用任意当前工作目录运行。 要找到相对于当前脚本的文件,请使用_dirname
或 _filename
:
|
|
使用readdir或readdirSync列出目录内容
|
|
同步变量可用作readdirSync
,它阻塞主线程,因此可以同时防止异步代码的执行。 大多数开发人员避免同步IO功能,以提高性能。
|
|
使用generator
|
|
通过管道流复制文件
该程序使用可读流和可写流与流类提供的pipe()
函数来复制文件
|
|
同步读取文件
对于任何文件操作,您将需要文件系统模块:
|
|
Reading a String
fs.readFileSync
的行为类似于fs.readFile
,但是它在同步完成时不会回调,因此阻止主线程。 大多数node.js开发人员喜欢异步变量,这将在程序执行中几乎没有任何延迟。
如果指定了encoding
选项,将返回一个字符串,否则将返回一个Buffer
。
|
|
检查文件或目录的权限
fs.access()
确定路径是否存在,以及用户对该路径上的文件或目录的权限。 fs.access
不返回结果,如果没有返回错误,则路径存在,并且用户具有所需的权限。
权限模式作为fs
对象fs.constants
上的属性可用
fs.constants.F_OK
- 具有读/写/执行权限(如果没有提供模式,这是默认值)fs.constants.R_OK
- 具有读取权限fs.constants.W_OK
- 具有写权限fs.constants.X_OK
- 具有执行权限(与Windows上的fs.constants.F_OK
相同)
异步
|
|
同步
fs.access
也有一个同步版本的fs.accessSync
。 使用fs.accessSync
时,必须将其包含在try/catch
块中。
|
|
检查文件或目录是否存在
异步
|
|
同步
在这里,我们必须将函数调用包装在try/catch
块中来处理错误。
|
|
确定文本文件的行数
app.js
|
|
逐行读取文件
app.js
|
|
创建或使用现有目录时避免竞争条件
由于Node的异步性质,首先要创建或使用目录:
用
fs.stat()
检查它的存在,然后根据存在检查的结果创建或使用它,
如果在检查时间和创建时间之间创建文件夹,则可能导致竞争条件。 下面的方法将fs.mkdir()
和fs.mkdirSync()
包含在错误捕获的包装器中,如果代码为EEXIST(已经存在),则异常通过。 如果错误是别的东西,像EPERM(pemission被拒绝),抛出或传递一个像本机功能那样的错误。
fs.mkdir()
的异步版本
|
|
同步版本fs.mkdirSync()
|
|
更改文本文件的内容
例。 它将使用简单的RegExp replace(/email/gim, 'name')
将文本email
替换为文本文件index.txt
中的name
|
|
使用流克隆文件
该程序说明了如何使用可读写的流使用createReadStream()
和由文件系统模块提供的createWriteStream()
函数来复制文件。
|
|
使用unlink或unlinkSync删除文件
异步删除文件:
|
|
您也可以同步删除*:
|
|
*避免同步方法,因为它们阻止整个进程,直到执行完成。
使用流将文件读入Buffer
在使用fs.readFile()
方法从文件读取内容已经是异步的时候,有时我们想要在一个Stream中获取数据,而不是简单的回调。 这样我们可以将这些数据管理到其他位置,或者将其处理成最后一次。
|
|
使用writeFile或writeFileSync写入文件
|
|
fs.writeFileSync
的行为类似于fs.writeFile
,但是它不会在同步完成时执行回调,因此阻止主线程。 大多数node.js开发人员喜欢异步变量,这将在程序执行中几乎没有任何延迟。
注意:在node.js中阻塞主线程是不好的做法。 同步功能只能在调试时使用或没有其他选项可用。
在Node.js中,资源密集型操作(例如I / O)异步执行,但具有同步对应(例如存在fs.readFile
,其对应方是fs.readFileSync
)。 由于Node是单线程的,所以在使用同步操作时应该小心,因为它们会阻塞整个进程。
如果进程被同步操作阻塞,那么整个执行周期(包括事件循环)将被停止。 这意味着其他异步代码(包括事件和事件处理程序)将不会运行,您的程序将继续等到单个阻止操作完成。
同步和异步操作都有适当的用途,但必须注意使用它们。