2

假设我们有一个已经存在的文件,比如说<File>. 此文件已由 C 程序打开以进行更新 ( r+b)。我们使用fseek导航到内部的一个点<File>,而不是它的末尾。现在我们开始使用fwrite/fputc. 请注意,我们不会删除以前存在于<File>...中的任何数据

系统如何处理这些写入?它是否将整个文件重写到磁盘中的另一个位置,现在包含新数据?它是否将文件分段并仅将新数据写入另一个位置(记住中间有一些可用空间)?它实际上是否仅覆盖已更改的部分

有一个很好的理由问:在第一种情况下,如果您不断更新文件,系统可能会变慢。在第二种情况下,它可能会更快,但如果对许多文件执行,它会弄乱文件系统。在第三种情况下,特别是如果您有固态磁盘,一遍又一遍地更新文件的同一位置可能会使磁盘的该部分无用。

实际上,这就是我的问题的来源。我已经读过,为了避免过度使用磁盘扇区,固态磁盘使用不同的技术将数据移动到使用较少的扇区。但是这些stdio函数究竟是如何处理这种情况的呢?

在此先感谢您的时间!:D

4

2 回答 2

1

文件系统处理程序创建一种对磁盘扇区的字典写入,因此当您更新文件的内容时,文件系统会查找磁盘上的字典,告诉它文件数据位于磁盘上的哪个扇区. 然后它旋转(或等到光盘到达那里)并更新光盘上的相应扇区。

那是简短的版本。

因此,在更新文件的情况下,文件通常不会移动到新位置。当您将新数据写入文件并附加到文件中并且数据不适合现有扇区时,则会分配其他扇区并将数据写入那里。

如果您删除文件,则通常这些扇区会被标记为空闲并被重复使用。所以只有当你打开一个新文件并重写它时,文件才可能被放在不同的扇区中。

但细节可能会有所不同,具体取决于硬件。AFAIK 如果您覆盖 CD 上的数据,则数据是新写入的(只要会话未完成),因为一旦写入 CD,您就无法更新 CD 上的数据。

于 2013-08-08T16:33:58.313 回答
0

您的理解不正确:“请注意,我们不会删除文件中先前存在的任何数据”

如果您寻找文件的中间并开始写入,它将覆盖之前该位置的任何内容。

这是如何在幕后完成的可能取决于硬盘中的计算机如何实现它。它应该在硬盘之外是不可见的,应该没关系。

于 2013-08-08T16:39:01.327 回答