Я имел дело с готовящейся проблемой и внезапно заставляет меня задуматься над этим вопросом ...

Может быть, это связано не только с 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,00 КБ.

Потому что, когда мы пишем букву G, все равно не превышает 4,00 КБ, поэтому у нас есть место для записи в пространство памяти 4,00 КБ.

Но когда мы добавим больше файлов в файл, при превышении 4,00 КБ будет использоваться 8,00 КБ.

Как двоичный файл, превышающий 4,00 КБ, записывается в память диска?

Записывает ли он указатель или что-то куда-то, объявляет индекс в памяти диска и записывает избыточный двоичный файл в новый адрес памяти?

1 ответ1

4

Такие проблемы, как это то, почему мы используем ОС, это обеспечивает уровень абстракции, поэтому вам не нужно беспокоиться на уровне приложений о таких вещах, как, как память хранится на аппаратном уровне.

Слои похожи на это (для жестких дисков), каждый слой показывает рядом с ним, кто отвечает за этот слой.

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

Каждый уровень не заботится о том, что делают уровни выше или ниже его, единственная важная вещь - это то, что он предоставляет известный API для прямого уровня над ним и использует известный API для прямого уровня под ним.

При написании приложений вы почти никогда не становитесь ниже уровня Bitstream (System.IO.Stream), когда вы записываете свои данные в поток, он передает их драйверу, а драйвер разделяет данные, однако на следующем слое ниже их необходимо разделить (4 тыс. Блоков для современных жестких дисков).

Для того, как водитель отслеживает "что идет куда?"«Это зависит от реализации драйвера.


Чтобы действительно ответить на ваш вопрос, Append работает с вашей программой и запрашивает битовый поток для файла. Получив поток битов, он добавляет больше данных в конец потока битов. То, что OS/Driver делает с этим потоком битов, когда вы пишете в него, это черный ящик (вы не знаете подробностей), и он будет совершенно другим, если вы работаете с FileStream, MemoryStream или NetworkStream. Самое замечательное в этой слоистой структуре - вам не нужно заботиться! Ответственность лежит на следующем слое вниз, и этот слой занимается этим.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .