好的,那么让我们逐点回答......
问题 1:当我在 NTFS 上创建文件时,它是否连续存储在物理硬盘上?
这个问题没有意义。当您创建文件时,NTFS 将在 MFT 中为它需要跟踪的元数据分配空间。小文件实际上可能适合文件的 MFT 记录 - 根据定义,此类常驻文件是连续的。如果文件不适合 MFT,则根据需要分配空间块,它们可能是连续的,也可能不是连续的。一般来说,它不知道你的文件有多大,也不知道要为它预分配多少空间——所以 NTFS 只会根据需要分配空间,尽管你可以通过调用SetEndOfFile
函数来给它一个提示。但这仅提供提示,并不能保证文件数据将存储在磁盘的连续区域中。事实上,说服自己即使文件系统执行实时碎片整理,它也永远不能保证可用空间作为单个连续的磁盘地址块可用。
问题 2:如果没有 - 有没有办法创建一个文件,这样当我写入它时,数据会连续存储在其中(在硬盘上)?类似于数据库中的范围。
为什么你认为这是一个重要的问题?您通常不应该关心文件系统如何存储您的数据;您应该只关心它确实存储数据的事实。您可能认为访问非连续存储的文件会更慢,但不一定如此;高级缓存算法和操作系统的预取通常会完全消除任何减速。如果您关心的是性能,那么您是否有实际的硬数据表明文件系统的碎片是一个问题?如果是这样,正确的方法是使用不同的文件系统或根本不使用文件系统。
问题 3:如果存在这样的文件 - 有没有办法从它(使用 C 读取系统调用)中读取数据。我可以使用的最大束大小是多少。
C 系统调用(如fread
)不了解 NTFS、碎片、“束”和块。他们所知道的只是如何从指定的文件句柄中读取请求的字节数并将数据放入您提供的缓冲区中。实际上,您可以指定您想要的任何大小,尽管 C 库将调用 O/S 和文件系统特定的 API 来读取块大小的倍数的数据,这是实现定义的。