FileStream如何附加物理作品?


0

我正在处理一个前置问题,突然让我想到这个问题....

也许不仅与FileStream有关,我想知道我们如何实际将二进制文件附加到文件中。

我想我的问题会导致两个问题:

  1. 硬盘内存的结构如何?
  2. 文件如何写入物理内存?

假设我有一个文本文件,包含“ABCDEF”,所以在物理内存(在硬盘中),内存应该包含带有文件头二进制等字母“ABCDEF”的二进制文件(实际上没有纯文本文件的头文件?)。 ...

所以这将是物理上的6字节,订单取决于处理器类型:

A        B        C        D        E        F
01000001 01000010 01000011 01000100 01000101 01000110

假设我们想在文件中附加一个字母'G',那么该文件将包含7个字节:

A        B        C        D        E        F        G

01000001 01000010 01000011 01000100 01000101 01000110 01000111

磁盘中的文件大小都应该是4.00KB。

因为当我们写字母G时,仍然没有超过4.00KB,所以我们有空间写入4.00KB的内存空间。

但是当我们在文件中添加更多内容时,当执行时,4.00KB将使用8.00KB。

如何将超过4.00KB的二进制文件写入磁盘内存?

它是否在某处写入指针或某些内容并在磁盘存储器中声明索引并将超出的二进制文件写入新的内存地址?



FileStream与此无关,问题由文件系统驱动程序直接处理。
Matteo Italia

没想到它会在维基百科中解释这个....所以我的猜测是正确的,它被激励到另一个地址。所以有一个索引,说明了fragemented memory的内存地址也是正确的我相信吗?然后我不明白为什么不存在Prepend的操作...应该可以只添加一个内存地址作为标题并指向文件内存地址的开头?
King Chan

@MatteoItalia文件系统驱动程序是什么操作系统?或者是来自处理器的东西?我对硬件系统不太熟悉...
King Chan

@KingChan:它是操作系统内部的一个驱动程序,它提供了对磁盘“扇区”抽象的“文件/目录/ ...”抽象。
Matteo Italia

Answers:


4

这样的问题是我们使用操作系统的原因,它提供了一个抽象层,因此您无需在应用程序级别关注内存如何在硬件级别上存储。

这些层与此类似(对于HDD驱动器),每个层旁边显示负责该层的人员。

        File (File system)
               |
               v
         Bitstream (OS)
               |
               v
    Sectors (Hardware Driver)
               |
               V
     Bits (Hard disk controller)
               |
               V
Magnetic flux (Hard disk controller)

每个层都不关心它上面或下面的层是做什么的,唯一重要的是它将一个已知的API暴露给它上面的直接层,并且它使用已知的API来到它下面的直接层。

在编写应用程序System.IO.Stream时,当你将数据写入流时,几乎永远不会低于Bitstream层(),它会将其交给驱动程序,驱动程序将分割数据,但是下面的下一层需要将数据拆分(4k块)适用于现代硬盘驱动器)。

对于司机如何跟踪“什么去哪里?” 这取决于驱动程序的实现。


要实际回答您的问题,程序附加工作请求比特流文件。一旦它具有比特流,它就将更多数据添加到比特流的末尾。一旦你写入它,操作系统/驱动程序对该比特流的作用是一个黑盒子(你不知道细节),如果你正在处理一个,或者一个FileStream,它将完全不同。关于这种分层结构的好处是你不需要关心!责任是下一层,而该层处理它。MemoryStreamNetworkStream


+1,但要么我不理解图表,要么出现了问题......流对象提供了文件的抽象,这些文件由FS驱动程序提供,它与与扇区一起工作的磁盘驱动程序进行通信。
Matteo Italia

@MatteoItalia并非所有层都是“抽象”,有些是接口。“文件”包含一个或多个流,该流为其下​​面的存储介质提供抽象,依此类推。所有的“文件”确实是一个名字。您告诉操作系统要访问该名称,然后从中获取一个文件句柄,以便您访问该流。那就是“真正的”抽象开始的地方。
Scott Chamberlain

+1非常详细的解释!谢谢!所以从你的解释中,我可以认为鼠标/键盘驱动程序也是......层......一个程序......它会向操作系统公开一个已知的API,所以我们可以做SendKey,Cursor.Position等简单的代码行来控制硬件?
King Chan

@KingChan确切地说,它只是另一组图层,为程序鼠标移动提供的图层(在这种情况下是Windows消息泵)不知道(也不关心)鼠标移动是来自连接的USB设备还是其他软件在电脑上。只要馈送消息泵的层遵循API,它就会将信息传递给需要了解移动的应用程序。
Scott Chamberlain

1
看到这个问题和答案的一些提示,为什么它很难提前
斯科特张伯伦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.