Как работают форматы файлов

Меня очень интересует, каким образом хранятся данные, как их хранить и читать из файлов, которые при открытии текстовыми редакторами показывают байты, тот же sublime text показывает в таких файлах группы символов по 4 символа. Как пример, архивы, растровые изображения, музыка, .dat файлы и прочее. Заранее спасибо за ответы.


Ответы (1 шт):

Автор решения: becouse

Создание нового файла происходит в логической файловой системе.

Файл состоит из нескольких частей. В файловой системе хранится логическая информация о файле (File Control Block) FCB (на рисунке показана часть FCB общая для разных ФС)

введите сюда описание изображения

Также FCB может содержать метаданные файла (атрибуты, время создания и пр.).

Следует различить тип файла с точки зрения ОС:

  • Каталоги
    • Файлы
    • Символьные специальные файлы (моделирование последовательных устройств ввода-вывода)
    • Блочные специальные файлы (моделирование дисков)
    • Обычные файлы
      • Бинарные (исполнимые)
      • Текстовые
        • Текстовые
        • Типизированные (видео, архив)
        • Шелл-коды

И тип файла с точки зрения прикладной программы:

Тип файла с точки зрения прикладной программы это обычный файл, чаще текстовый (типизированный файл). Здесь тип файла (картинка, видео, файл программы, архив и т.п.) распознается либо по метаданным либо по сигнатуре в начале файла.

Например сигнатура JPEG

Сигнатура файла имеет широкое применение и существуют стандартизированные сигнатуры для различных популярных форматов файлов.

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

Файлы, как правило, имеют атрибуты, которые обычно включают в себя следующее:

  • Имя файла
  • Идентификатор
  • Тип
  • Расположение
  • Размер
  • Защита
  • Время, Дата, UserID

Файлы часто имеют расширения, отделенные от имени файла точкой, например fork.txt. Расширение txt сообщает нам некоторую информацию о файле - текстовый файл.

Это - в основном подсказки ОС или пользователю о том, что это за файл. В большинстве операционных систем любая программа может открывать произвольные файлы. Расширение .docx является всего лишь предложением, чтобы его открывали программы обработки текста.

Операционные системы обычно позволяют установить программу по умолчанию для расширения: например, всегда открывать файлы .docx с помощью LibreOffice.

Методы доступа к файлу

Последовательный доступ простейший метод.

Информация в файле обрабатывается по порядку, один раздел за другим. Большинство операций это чтение и запись.

Операции могут выглядеть примерно так: read\next переход к следующей записи и чтение.

Обычный вид доступа - прямой доступ

Любая часть файла может быть доступна в любое время.

Вместо того, чтобы читать следующий блок или переходить к следующему блоку, мы можем читать или искать произвольный блок.

Пример копирования файла в Linux

#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUF_SIZE 1024

int main(int argc, char *argv[])
{
    int inputFd, outputFd, openFlags;
    mode_t filePerms;
    ssize_t numRead;
    char buf[BUF_SIZE];

    if (argc != 3)
        printf("%s old-file new-file\n", argv[0]);

    /* Открываем входной и выходной файл */

    inputFd = open(argv[1], O_RDONLY);
    if (inputFd == -1)
        printf("Ошибка открытия файла %s\n", argv[1]);

    openFlags = O_CREAT | O_WRONLY | O_TRUNC;
    filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
                S_IROTH | S_IWOTH;      /* rw-rw-rw- */
    outputFd = open(argv[2], openFlags, filePerms);
    if (outputFd == -1)
        printf("Ошибка создания файла %s\n", argv[2]);

    /* Перемещаем данные блоками пока файл не кончится */

    while ((numRead = read(inputFd, buf, BUF_SIZE)) > 0)
        if (write(outputFd, buf, numRead) != numRead)
            printf("невозможно записать в файл\n");
    if (numRead == -1)
        printf("ошибка чтения\n");

    if (close(inputFd) == -1)
        printf("ошибка закрытия исходного файла\n");
    if (close(outputFd) == -1)
        printf("Ошибка закрытия копии файла\n");

    exit(EXIT_SUCCESS);
}
→ Ссылка