Добавить к файлу без временного файла, манипулируя inode?

Добавление большого файла к большому файлу затруднено, так как для этого требуется протолкнуть вперед все остальные символы. Однако можно ли это сделать, манипулируя inode следующим образом?:

  • Выделите новый блок на диске и заполните его начальными данными.

  • Настройте индексный дескриптор, чтобы сообщить ему, что ваш новый блок теперь является первым блоком, и переместите прежний первый блок на позицию второго блока, прежний второй блок на третью позицию и так далее.

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

Я также понимаю, что новый первый блок будет «коротким» блоком (не все данные в блоке являются частью файла), поскольку ваши данные в начале вряд ли будут точно такого же размера, как блок.

Или, если блоки inode просто связаны, для выполнения вышеописанного потребуется совсем немного усилий.

ПРИМЕЧАНИЕ: мой последний опыт прямого манипулирования данными на диске был с Commodore 1541, поэтому мои знания могут быть немного устаревшими...


person Community    schedule 07.07.2013    source источник


Ответы (2)


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

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

YMMV, я просто подбрасываю идеи. ;)

person Sven    schedule 16.07.2013
comment
Я согласен, что иноды должны быть скрыты. Мы ищем способ, с помощью которого ОС могла бы возиться с inode за нас. Поскольку файл представляет собой дерево, вставка в начало или в любое другое место должна быть такой же быстрой, как вставка только в конец путем добавления к файлу. - person Bruno Martinez; 16.07.2013
comment
Если структура учета экстента inode является древовидной (что зависит от FS), то перемещение разреженного файла в начале должно - теоретически ;) - сработать. Вы пробовали? - person Sven; 16.07.2013
comment
IIUC, вы предлагаете зарезервировать 50 МБ разреженного неиспользуемого пространства в начале файла, записать где-нибудь, какую часть файла игнорировать при чтении, а когда у вас появится новый МБ для добавления, уменьшить его до 49 и записать в конце разреженный раздел. Это должно работать, но было бы неплохо иметь возможность вставлять в любой момент файла. - person Bruno Martinez; 16.07.2013

Это может сработать! Да, пользовательские программы не должны возиться с инодами. Да, это обязательно зависит от того, какая схема используется для отслеживания блоков, какие файловые системы реализуют эту функцию. Ничто из этого не является причиной для того, чтобы отвергнуть это предложение сразу.

Вот как это может работать.

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

Теперь предположим, что вы хотите добавить данные. Это будет примерно так.

IF (new data will fit into unused space in first data block)
  write the new data to the beginning of the first data block
  update the starting-offset
  return success indication to caller

try to allocate a new data block
IF (block allocation failed)
  return failure indication to caller

shift all existing data block pointers down by one
write the ID of the newly-allocated data block into the first slot of the array
write as much data as will fit into the second block (the old first block)
write the rest of data into the newly-allocated data block, shifted to the end    
starting-offset := (data block size - length of data in first block) 
return success indication to caller
person Bruce Lueckenhoff    schedule 17.07.2013