вставка в середину файла

Тема в разделе "WASM.BEGINNERS", создана пользователем Ss_oO0, 17 янв 2007.

  1. Ss_oO0

    Ss_oO0 New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2006
    Сообщения:
    65
    Извините, может тупой вопрос. Есть большой файл, скажем 2Гб. Пусть мне нужно в середину этого файла вставить 4 байта. Для этого что, нужно будет весь оставшийся хвост перетаскивать? Или есть какие-то еще элементарные операции кроме read(), write() и seek()?
     
  2. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    нету
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    На уровне фс будет чуть проще в том плане, что не придётся копировать половину всего файла: определяешь необходимый фрагмент файла (куда вставить надо), смотришь, есть ли свободное место для перемещения, если нет - копируешь в другое место и пишешь, что нужно. И правишь ссылки на блоки. Но это теория.
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    IceStudent
    Ну, это оччень круто! И все портит 4 байта, был бы размер блока, тогда можно было бы геморрнуться.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Если файл не шифрованный, не сжатый, то это не так уж и сложно.
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    n0name
    Ну да, особенно в разделе для начинающих. Хотя здесь иногда такие вопросы задают...
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    пора создавать собственную фс

    по теме: а может у sparced'ов есть какие-нибудь фишки..
    никто как следует не разбирался?
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Nouzui
    Если ты про sparsed files в ntfs, то это немного не то.
     
  9. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    IceStudent
    про них
    насколько я себе представляю, в спарседах хранятся отдельные блоки данных + инфа о смещениях этих блоков внутри файла
    при обращении к смещению, попадающему на такой блок, драйвер фс возвращает соответствующие данные, если же смещение не попадает ни в один из блоков - нули
    так что если подправить инфу о смещении одного из таких блоков - данные этого блока мгновенно перенесутся в другую часть файла без копирования
    просто мелкомягкие не стали делать соответствующие ioctl
    единственное, чего я не знаю - это как блоки хранятся физически - если они должны начинаться с начала кластера, то с реализацией сабжа возникают проблемы: если упомянутые 4 байта нужно будет вставить в середине кластера.. дальше понятно
    с другой стороны, если это так, то как тогда будет работать код FSCTL_SET_ZERO_DATA, если FileOffset и BeyondFinalZero не выровнены на границы кластеров?
    и, в конце концов, даже если блоки должны начинаться с начала кластера, можно расщепить блок на три части: одна до модифицируемого кластера, вторая после, и третья - сам кластер, куда и будут вставлены данные
    просто microsoft пожадничала сделать такие ioctl'ы
    или я что-то неправильно понимаю?
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    IceStudent
    Не понял - разве в середине файла может быть не заполненный кластер с 4 байтами, а остальное пусто? ИМХО в FAT такое только на хвосте висеть может или в NTFS по другому?
     
  11. Ss_oO0

    Ss_oO0 New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2006
    Сообщения:
    65
    В принципе ничего не мешает создать свою ФС, где файл будет храниться как связный список, т.е. блок инфы + указатель на следующий блок. А может такие ФС уже есть, для линукса, например. Если знаете, подскажите (только желательно чтобы был системный интерфейс для манипуляции блоками).

    Кстати, в reiserfs с включенным tail-packing-ом маленькие файлы ужимаются в один кластер.
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Ss_oO0
    Дык в принципе и ФС для этого не обязательно - достаточно своего формата файла, который сам по себе может быть связанным списком - М$ офис так и поступает и не только он :)
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Y_Mur
    Да, ты прав - вставка повлечёт за собой изменение остальных кластеров, если только она не кратна размеру кластера.

    Ss_oO0
    Практически все существующие ФС так и сделаны, просто размер блока у них фиксированный.

    В NTFS файлы, меньше 1кб вообще "не занимают" место на диске - они хранятся в таблице размещения файлов.