- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
fs.appendFile()
的文档对于原子性保证含糊不清。
我特别想知道,如果在同一个文件上对数据进行两次或多次调用,而不等待其间的回调,是否可以交错或删除数据(例如,由于写入重叠区域)。例如,采用以下代码:
fs.writeFileSync('blort.bin', '');
for (let i = 0; i < 10; i++) {
const data = Buffer.alloc(65536, i);
fs.appendFile('blort.bin', data, () => {});
}
假设没有文件系统错误并且没有其他进程写入相关文件,那么在完成所有追加操作后,Node 会做出以下保证吗?:
我也很好奇是否有任何序列化保证(尽管我认为没有)。也就是说,追加是否保证按顺序执行?
更新:添加了说明,表明这是作用于该文件的唯一代码。
最佳答案
据我所知,您的追加将按顺序进行,除非另一个进程正在写入目标文件,否则不会覆盖现有数据。
Node 是单线程的(从正在运行的应用程序的角度来看),并在内部对文件写入进行排队,因此如果将 1
2
和 3
写入文件,该文件将包含 123
。
Node 确实会启动新线程来处理 IO,但这是运行时的一项功能,对开发人员是隐藏的。
更新
在第一次阅读时,我错过了您的要求,即您的附加发生在回调为空或不起作用的多个调用中。
这极大地改变了事情。
如果您使用异步调用,例如fs.appendFile()
,则必须提供一个必须检查错误的回调。如果您在不等待回调结束的情况下堆叠异步调用,则无法保证您的写入会按顺序发生或不会覆盖以前的数据。
底线:如果没有始终检查错误的适当回调,请勿使用异步函数。
否则就会破坏 Node 事件驱动模型的整个理念。
我通常解释这一点的方式是考虑到,在异步调用中,由于包括 cpu 和 IO 负载在内的众多因素,您无法预测何时触发回调。
如果您无法知道回调何时被触发,则无法预测多个调用将按顺序运行。
更新2
需要明确的是,您无法在不提供回调的情况下调用异步函数并保证任何预期行为。
从事件的角度思考:
fs.appendFile()
将事件处理程序添加到 IO 线程,并将包含其参数的事件发送到 IO 线程。
操作完成后,将触发此事件处理程序,该事件处理程序要么是您的回调,要么将触发您的回调。
如果不等待操作完成,则无法保证操作已成功或已完成您期望的操作。
关于node.js - `fs.appendFile()` 的原子性保证是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44464284/
我可以使用下面的函数来覆盖一个文本文件: let writeFile ~filename:fn s = let oc = open_out fn in output_string oc s;
以下代码的作用是从一个文件夹中取出几个文本文件并将它们附加到一个文件中: #!/usr/bin/env node 'use strict' const fs = require('fs') ,
fs.appendFile() 的文档对于原子性保证含糊不清。 我特别想知道,如果在同一个文件上对数据进行两次或多次调用,而不等待其间的回调,是否可以交错或删除数据(例如,由于写入重叠区域)。例如,采
我是nodejs新手,我正在尝试附加功能。当我运行下面的代码时,只需在提示用户后输入有关最喜欢的歌手的信息,然后将其放入包含歌手姓名的文件中。并附加最喜欢的歌曲,似乎如果用户输入退出,则应该将其附加到
我刚开始使用 Nodejs 编写聊天日志机器人。现在效果很好。除了几个小时之后。机器人会为每个用户创建一个文档,如果该用户尚不存在这样的文档,则该用户将键入一些内容;如果存在,则它将把它放入该文件中。
如果多个独立的 Node 进程使用 fs.appendFile() 将文本 block (每个大于 4KB)附加到单个文件,我是否可以在没有文件锁定的情况下丢失/损坏数据scheme 还是 fs.ap
应用程序必须将日志数据存储到网络驱动器。当驱动器托管在 Windows 下时,一切正常。当驱动器托管在 Mac 下时,读/写是可以的,但是 append 获取 EPERM,所以 log 根本不起作用。
console.log 正确返回 req.query (request.query),如 { name: 'sean', comments: 'Hey' }。但是当我尝试使用 fs.appendFil
我在尝试使用 Zend 的 headScript()->appendFile('file name') 附加 javascript 文件时遇到问题。我的布局设置如下: headScript()
http://nodejs.org/api/fs.html#fs_fs_appendfile_filename_data_options_callback fs.appendFile 是否保持打开文件
我正在尝试将数据附加到某些文件中。 文档说fs.appendFile: Asynchronously append data to a file, creating the file if it no
我一直在尝试创建一个程序来保存 Slack 团队的日志。我已经完成了大部分工作,但到目前为止无法成功使用 fs.appendFile() ,因为文档声称如果文件不存在,它将创建该文件(并且不要事先使用
我有一个应用程序,它在运行时在其工作目录中创建一些 CSV 文件。该应用程序在我的 docker 容器之外运行良好,但是当我在其中运行它时,出现错误: Error: ENOENT: no such f
我在创建与 Node 并行的进程时遇到了问题,同时在完成简单的 HTTP GET 请求后退出。我注意到,如果我在appendFile 的回调中触发process.exit(),某些文件将不会在 Nod
查看 fs 文档,我正在寻找一个可以与 fs.appendFile 一起使用的标志,如果路径不存在,则会引发错误。 如果路径已经存在,我会看到与引发错误有关的标志,但如果路径不存在,我没有看到会引发错
我有一个包含大约 120k HTML 页面的文件夹,我需要打开这些页面(每个文件大约 70kb),使用 xPath 解析一些数据并将该数据附加到 .csv 文件。 下面是我的代码: 它应该从 pars
我正在开发将使用 开始的 node.js 应用程序 for(i=0; i
我是一名优秀的程序员,十分优秀!