我有一个小问题:
例如,我正在使用来自.NET Framework的System.IO.File.Copy()方法。这个方法是CopyFile()函数的托管包装器,它来自WinAPI。但是CopyFile函数是如何工作的?它与HDD的固件进行交互,还是通过汇编语言执行其他操作,或者可能是其他某些方式...
从最高层次到最低层次,它是什么样子的呢?
我有一个小问题:
例如,我正在使用来自.NET Framework的System.IO.File.Copy()方法。这个方法是CopyFile()函数的托管包装器,它来自WinAPI。但是CopyFile函数是如何工作的?它与HDD的固件进行交互,还是通过汇编语言执行其他操作,或者可能是其他某些方式...
从最高层次到最低层次,它是什么样子的呢?
这些信息通常称为“文件系统元数据”。 当磁盘被“格式化”时,现在只需要写入新的文件系统元数据即可。 在旧时代,实际上需要在空白磁介质上写入扇区标记和其他信息(通常称为“低级格式化”)。 如今,大多数驱动器已经具备低级格式。
对于我们简单的示例,我们必须为目录分配空间以及为“目录表”分配空间,它包含了哪些块正在使用的数据。
我们还将说文件系统必须从块16开始,以便操作系统可以使用前16个块,例如“引导扇区”。
因此,在块16处,我们需要存储14个字节(每个文件条目)* 1024(文件数量)= 12K。 将其除以512(块大小)得到24个块。 对于我们的10MB驱动器,它有20,480个块。 20,480 / 8(8位/字节)为2,560字节/ 512 = 5个块。
在磁盘上可用的20,480个块中,文件系统元数据占29个块。 加上操作系统的16个块,总共占用了20,480块中的45个块,剩下20,435个“空闲块”。
最后,每个数据块都保留了最后2个字节以指向文件中的下一个块。
现在,要读取文件,您需要在目录块中查找文件名。 从那里,您找到该文件的第一个数据块的偏移量。 您读取该数据块,获取最后两个字节。 如果这两个字节是00 00,则表示已经到达文件末尾。 否则,取该数字,加载该数据块,并继续进行,直到整个文件被读取。
文件系统代码隐藏了末尾指针的详细信息,只是将块加载到内存中供程序使用。 如果程序执行read(buffer, 10000),则可以看到它将转换为从磁盘中读取几个数据块,直到填满缓冲区或到达文件末尾。
要写入文件,系统首先必须在目录中找到可用空间。一旦找到,它就会在TOC位图中找到一个可用块。最后,它会获取数据,写入目录条目,将其第一个块设置为来自位图的可用块,切换位图上的位,并将数据写入正确的块。系统将缓冲此信息,以便最理想的情况下只需在块满时写入一次。