Filesystems 是否在所有文件系统上顺序写入没有刷新字节的文件?

Filesystems 是否在所有文件系统上顺序写入没有刷新字节的文件?,filesystems,Filesystems,我正在写JSON文件。这意味着对于每个'{'字符,都有一个相应的'}',文件中的最后一个字节是'}'。写操作按顺序进行。没有fSeek。因此,如果对文件的写入被某种方式中断,我希望会有一个无效的JSON文件 现在,一个假设的文件系统可能会决定按顺序刷新我的字节。这意味着,如果在写入过程中发生断电,在刷新所有内容之前,我可以得到一个不包含我想要的数据的有效JSON。我可以使用字符串“xxx”,而不是“yyy”,或者数字末尾缺少数字 这样的文件系统存在吗?我可以相信这样一个事实:如果一个文件是有效的

我正在写JSON文件。这意味着对于每个
'{'
字符,都有一个相应的
'}'
,文件中的最后一个字节是
'}'
。写操作按顺序进行。没有fSeek。因此,如果对文件的写入被某种方式中断,我希望会有一个无效的JSON文件

现在,一个假设的文件系统可能会决定按顺序刷新我的字节。这意味着,如果在写入过程中发生断电,在刷新所有内容之前,我可以得到一个不包含我想要的数据的有效JSON。我可以使用字符串
“xxx”
,而不是
“yyy”
,或者数字末尾缺少数字

这样的文件系统存在吗?我可以相信这样一个事实:如果一个文件是有效的,那么它就保证是完整的吗


编辑:此问题适用于缺少最后一个字节的数据无效的情况。JSON在这里是说明性的。从技术上讲,
42342
是一个有效的JSON,如果不完整,则无法对其进行验证。

文件系统可能会使页面乱序的原因有几个:

  • 该页包含来自2个文件的数据,另一个文件正在刷新到磁盘
  • 页面在进程的工作集之外(因此不值得缓存),操作系统需要内存用于其他目的
  • 文件系统是分布式的,例如OrangeFS或Andrew文件系统,并且按照非常不同的实现规则进行播放
  • NFS文件系统面向一组更复杂的分布式、异构设备,其中一些写入是完全同步的,应用程序也不明智
它不仅是文件系统,而且是底层设备

  • 块设备可以进行缓冲,直到文件系统实际需要完全刷新为止,并按照它认为合适的顺序进行刷新(因为它不知道文件的概念)
  • 块设备可以分条(RAID 0),以便一个设备可以先刷新另一个设备
这就是说,在崩溃后不太可能出现像xxx这样的3字节丢失。更可能出现块丢失,例如4096字节的倍数

事实是,大多数文件系统对崩溃期间写入的数据的完整性(相对于元数据)几乎并没有保证

当需要原子性时,应用程序通常会利用原子性或其等价物:

  • 写入临时文件,例如使用
  • 刷新文件,例如使用并关闭文件
  • 将文件重命名为目标名称,例如使用
  • 我所知道的所有正在使用的POSIX文件系统都以崩溃安全的方式实现POSIX重命名,我想NTFS也可以

    但是POSIX显然没有严格要求它。因为您正在编写新文件,所以问题不大,但如果您想变得特别偏执,可以添加另一个步骤:

  • 删除临时文件(如果不存在,则忽略该错误)

  • 您是覆盖现有文件还是写入新文件?你在用哪个文件系统?我在写新文件。我还在ntfs和ext4上开发和测试该软件,但它是为一个可能在任何文件系统上运行的库设计的