我有一个小问题:

例如我使用System.IO.File.Copy()从.NET框架的方法。该方法可用于的CopyFile()从WinAPI的功能的托管包装。但是的CopyFile函数是如何工作的?它与硬盘的固件或相互作用或者也许一些其他的操作都通过汇编程序进行,也许其他的东西......

它是如何看起来像从最高级别到最低?

有帮助吗?

解决方案

更好的开始在底部和工作的方式了。

磁盘驱动器被组织,在最低水平,在扇区,曲目,及头的集合。扇区是一个轨道的片段,磁道上的磁盘本身区域,由磁头的位置作为表示盘片旋转下方它,并且头部的是,从盘片中读取数据的实际元件。

由于曲目是基于一个头是从盘的中心的距离测量中,可以看到如何朝向盘的一个轨道的“长度”的中心比一个短在磁盘的外边缘。

扇区的轨道的片通常是固定长度的。所以,内轨道将持有较少的部门比外轨道。

许多这样的磁盘几何的由驱动控制器本身时下处理,尽管在过去的这个组织是由操作系统和磁盘驱动程序直接管理。

在驱动电子设备和磁盘驱动器协作,以尝试并代表磁盘作为一系列连续的固定长度的块。

因此,可以看到,如果你有一个10MB的驱动器,并且使用512个字节的磁盘块,然后该驱动器将具有20480“块”的容量。

此块组织,乃是一切建立的基础。一旦你有了这个功能,你可以告诉磁盘,通过磁盘驱动器和驱动器控制器,去一个特定块磁盘上,和读/写新的数据该块。

一个文件系统组织的块的这个堆在到它自己的结构。该FS必须跟踪正在被使用的块,并且通过该文件。

大多数文件系统有一个固定的位置“他们开始”,就是一些地方,在启动时,他们可以去尝试和了解磁盘布局信息。

考虑不具有目录和支持具有8信名和3字母的扩展名,外加的状态信息1个字节,2个字节用于块数量的文件所在的文件开始在盘上的粗文件系统。我们还可以假设,该系统具有的1024个文件的硬性限制。最后,它必须知道正在使用的磁盘上的块。对于将使用1位每块。

此信息通常被称为“文件系统元数据”。当一个磁盘被“格式化”,如今它只是写新的文件系统元数据的问题。在过去,它实际上是写入扇区标记和空白磁介质等信息(即通常所说的“低级格式化”)的问题。今天,大多数驱动器已经具有低电平格式。

有关我们的粗例如,我们必须分配用于目录空间和空间的“目录表”,即表示正在使用的块的数据。

我们还可以说,文件系统必须在块16开始,以使操作系统可以使用,比如说,一个“引导扇区”第16块。

因此,在块16中,我们需要存储14个字节(每个文件条目)* 1024(文件数)= 12K。除以512(块大小)是24个块。对于我们的10MB驱动器,它有20,480块。 20480/8(8位/字节)是2560个字节/ 512 = 5个块。

在磁盘上提供的20480块,文件系统元数据是29块。添加在16用于操作系统,即45块的块出20480,留下20435“空闲块”。

最后,每个数据块的保留最后2个字节,以指向在该文件中的下一个块。

现在,读取文件,你在目录块查找的文件名。从那里,你会发现偏移到该文件的第一个数据块。你看的数据块,抓住最后的两个字节。如果这两个字节是00 00,那么这是该文件的末尾。否则,取该数量,加载该数据块,并且继续下去,直到整个文件被读取。

在文件系统的代码隐藏指针的细节在端部,并且简单地装载块到存储器中,由程序使用。如果Program不读(缓冲,10000),你可以看到这将转化为从磁盘读取数据的几个街区,直到缓冲区被填满,或者到达文件的末尾。

要写入文件时,系统必须首先找到在目录中的自由空间。一旦有,它就会发现在TOC位空闲块。最后,它需要的数据,写的目录项,从位图设置它的第一个块的可用块,可打开,位图位,然后取数据,并将其写入正确的块。该系统将缓存此信息,以便最好只编写一次块,当他们满。

作为它写入的块,它继续从TOC消耗比特,和链中的块一起,因为它去。

除此之外,“文件拷贝”是一个简单的过程中,从一个系统的杠杆的文件系统的代码和磁盘驱动程序。文件复制只需在读取缓冲器中,填充它,从写入缓冲器中。

在文件系统必须维护所有元数据,跟踪你在哪里从文件中读取,或者你正在写。例如,如果你从文件中读取只有100个字节,显然该系统将需要阅读的整个512字节的数据块,然后“知道”它是在字节101当您尝试从文件读取另一个100个字节。

另外,我希望这是显而易见的,这是真的,真的很粗的文件系统布局,有很多的问题。

但基本面都在那里,而且所有文件系统中类似这样的一些方式工作,但在细节上差别很大(大多数现代文件系统没有硬性限制更多,作为一个简单的例子)。

其他提示

这是一个苛刻的问题或一个很长的答案,但我想尽量简短。

基本上,在.NET Framework包装一些“天然的”呼叫,其在较低级别的库处理的呼叫。这些低级别的通话往往包裹在缓冲逻辑隐藏复杂的东西像你同步文件内容。

下面,有天然水平,与OS”内核交互。内核,任何操作系统的核心,那么你的翻译高级指令的东西你的硬件能够理解的。 Windows和Linux是例如两者使用硬件抽象层,隐藏了一个通用的接口后面具体硬件细节的系统。编写驱动程序的特定设备,然后实现所有方法的某些设备必须提供的唯一任务。

在任何被调用您的硬件,文件系统的介入,而对于本身也缓存文件系统和缓存了很多,但同样透明的,所以你甚至不会注意到。在呼叫队列中的最后一个元素是装置自身,并且再次,大多数设备符合一些标准(如SATA或IDE),因此可以以类似的方式相连接。

我希望这有助于: - )

在.NET框架调用Windows的API。

在视窗API有功能用于跨各种文件系统管理的文件。

然后,它取决于所涉及的文件系统上。请记住,它不一定在HDD中的“正常”的文件系统;它甚至可能是一个外壳扩展,只是模拟驱动器,并保持在你的Gmail帐户,或任何数据。的一点是,在Windows API中相同的文件操作函数被用作在数据的许多可能的较低层的抽象。

因此,答案实际上取决于你感兴趣的类型的文件系统。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top