php Дописать не читая всё - можно, прочесть кусок - можно, а удалить-то как???

Discussion in 'PHP' started by Mixon, 27 Jul 2012.

  1. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    В общем задача просто-таки элементарная (для других ЯП), но вот с пыхом это просто гемор.

    Нужно удалить первые n байт из файла.
    Тобишь, есть файл text.txt, с него удалить надо допустим первые 10 байт (первую строку), не читая весь файл и тем-более не перезаписывая его.

    Варианты типу: "Прочесть весь => Обрезать в переменной => Сохранить" не катят

    Файл будет ~10гиг, прочесть его кусками - проблем нет, через fgets, и дописать в конец не трогая всего - тоже нет проблем, а удалить как?

    Вещь очень нужная, так-что надо думать даже в сторону других ЯП с которыми можно будет сообразить что-то через exec...
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Mixon
    Пример кода, пожалуйста. Файловые системы - не умеют удалять часть файла из начала. Для такой операции в любом случае придется переписывать файл.

    Однако читать целиком файл в переменную - действительно не имеет смысла. Достаточно дважды открыть файл на чтение и запись и читать-писать поблочно.
     
    _________________________
  3. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Элементарная для других яп? Код в студию на другом яп, который выполнит данную задачу.
     
    _________________________
  4. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Файловые системы - не умеют удалять часть файла из начала.
    Gifts, Файловые системы караз могут сделать либо-что с файлом, в плоть до создать файл в котором будет каждый второй байт жёсткого диска содержать :D
    Можно даже удалить средину файла не зацепая остального, и мало того - даже не удаляя самых данных
    Фрагментация - самый простой пример этому.
    [​IMG]

    Сам код не смотрел (хотя в поиске много вопросов вида "удалить первые n байт"), но я уверен что варианты в более серьёзных языках есть, типу сдвига байтов.

    В самом крайнем случае - можно сделать на прямую работу с жёстким диском, в плоть до сдвига лимитов файла в таблице файлов (если нет фрагментации файла то там указан начальный и конечный физический адрес файла, если сдвинуть этот адрес на 10 байт дальше то сам файл станет меньше, а его байты "сдвинутые" станут просто незанятым местом, которое затрётся при копировании или дефрагментировании позже)

    Щас открывать билдер и писать такой код для редакта FAT сетки для примера вам не буду, ибо идею я рассказал.

    по факту запись в конец через fwrite добавляет в конец данные и потом сдвигает задний лимит файла. А мне начальный-бы сдвинуть и было-бы хорошо.

    п.с. это первый вариант решения что пришёл в голову, если сесть подумать то я уверен - найдётся еще десяток-два нормальных, но наврядли один с них потянет php...

    Кстати интерестные алгоритмы думаю у БД MySQL, ибо она удаляет за сотые доли запись с БД своей, которая на жёстком диске, соответсвенно не трогая остальные байты, ибо еслиб она за каждым удалением это делала то базы по 1 000 гиг чуток дольше сохранялись :D
     
    #4 Mixon, 27 Jul 2012
    Last edited: 27 Jul 2012
  5. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Ага, будешь под каждую файловую систему писать такой код? Под вин7 тебе ещё права администратора понадобятся небось, а кто же гоняет сервер под админом...

    Ну так перегони данные из файла в базу и проводи манипуляции. Факт в том, что, например, для набора бинарных данных зашифрованных размером 8 гб ты такую модель не реализуешь.
     
    _________________________
  6. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    1. Я данный пример привёл место "код в студию на другом ЯП", попросили - я привёл, мне он и не подходит ибо мне надо на php решение а не такое как в таком примере, я лишь показал что это реально.
    2. В базу нет смысла переганять ибо эти данные будут постоянно обновлятся, а переганять их в БД очень не удобно
    3. О зашифрованных данных речь и не шла, я не ставил на жёсткий шифрования.
     
  7. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Пустой диалог.
    В общем это невозможно. Что дальше?
     
    _________________________
  8. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Искать велосипед через который можно будет, в плоть до системы через exec и подобное)
     
  9. -=lebed=-

    -=lebed=- хэшкрякер

    Joined:
    21 Jun 2006
    Messages:
    3,803
    Likes Received:
    1,957
    Reputations:
    594
    Проще простого, читаем первую и вторую строку, сбрасываем указатель на начало файла (на две строки назад), затем пишем вторую строку, сдвигаем указатель снова назад на две строки и т.д. в цикле так. Прочитать в итоге придётся весь файл и перезаписать его полностью.
     
  10. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Хм, уже по лучше вариант чем "невозможно", инетерстный, но получается в начале будет норм а потом с арифметической прогрессией будет больше и больше тупить, а это not good:(

    В общем я понял, человеческого решения не найти.
    Переписал софт, теперь вся БД генерится в режиме он-лайн, а не берётся готовая.
    Всем пасиб :)
     
  11. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    -=lebed=- я написал то же самое, только чувствую два дескриптора быстрее чем fseek

    Mixon
    Феерическое непонимание способов организации и адресации данных в файловых системах. Почитайте на досуге что такое кластеры и секторы, например.
     
    _________________________