当前位置: 首页 > 面试题库 >

强制将文件写入磁盘

吕霍英
2023-03-14
问题内容

我目前正在实施ping / pong缓冲方案,以安全地将文件写入磁盘。我在Linux / CentOS计算机上使用C ++ /
Boost。现在,我面临的问题是强制将文件实际写入磁盘。不管文件系统的所有缓存策略(ext3 / ext4)/ SO自定义规则/
RAID控制器/硬盘控制器如何,都可以这样做吗?

最好使用普通的fread()/ fwrite(),c ++ ostream或boost文件系统?

我听说,仅刷新文件(fflush())并不能保证实际写入


问题答案:

fflush(对于FILE *),std :: flush(对于IOStream)强制您的程序发送到OS。

POSIX有

  • sync(2)要求计划写入其缓冲区,但是可以在写入完成之前返回(Linux等待返回之前将数据发送到硬件)。

  • fsync(2)可以保证等待数据发送到硬件,但是需要一个文件描述符(您可以使用fileno(3)从FILE *获取一个文件描述符,我知道没有标准的方法可以从IOStream)。

  • O_SYNC作为打开(2)的标志。

在所有情况下,硬件都可能拥有自己的缓冲区(但是,如果有控制权,一个好的实现也将尝试刷新它们,并且ISTR表示某些磁盘正在使用电容器,以便它们能够刷新电源发生的任何变化)网络文件系统也有自己的警告。



 类似资料:
  • 问题内容: 我有23位表示为字符串,并且需要将此字符串作为4个字节写入二进制文件。最后一个字节始终为0。以下代码有效(Python 3.3),但感觉不太好(我对Python和编程很陌生)。您有任何改善技巧吗?似乎for循环可能有用,但是如何在循环中进行切片而不出现IndexError?请注意,当我将位提取到一个字节中时,我会反转位顺序。 问题答案: 您可以将其视为int,然后按以下方式创建4个字节

  • 我想以这种形式将短int x=0x4740写入二进制文件:0100 0000 0100 0111,当我在记事本中打开它时,它是@G。它正在工作。当我尝试编写例如短int a=0xf0ff;(二进制:1111 0000 1111 1111)时,记事本显示给我的不是我的数字二进制(➕是1100 1011 1001 1001 1100 0100 1001 0001)。如何在这个文件中编写它并获得1111

  • 问题内容: 我将如何将javafx.scene.image.Image图像写入文件。我知道您可以在BufferedImages上使用ImageIO,但是有什么方法可以使用javafx图像吗? 问题答案: 差不多3年后,我现在有知识去做并回答这个问题。是的,原始答案也是有效的,但它涉及到先将图像转换为BufferedImage,我理想上想完全避免摆动。虽然这确实会输出图像的原始RGBA版本,足以满足

  • 问题内容: 我正在尝试从Http帖子回复文件写入 sdcard 上的文件。一切正常,直到检索到字节数据数组为止。 我尝试在清单中设置权限,并尝试了许多在网上找到的教程的不同组合。 我所能找到的只是使用活动的方法,但是我的应用程序如何通过线程来写入文件。具体来说,当必须写入文件时,会从另一个线程中调用一个线程,因此即使我尝试了活动对象,也无法使用它。 该应用程序已经走了很长一段路,我无法更改当前编写

  • 我在做一个CSC 110项目。尽管我们还没有学过字典,我还是试着用字典来完成我们的作业。 我有一份国家和他们赢得多少奖牌的档案,用新的行字符隔开。例如: 虽然这是有效的,但它是肮脏和过于复杂。我正想出一个新方法来做这件事。