![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
День добрый. У меня возник такой вопрос. Для начала немножко кода:
А теперь вопрос. Дело в том, что мне нужно не только добавлять записи, но и удалять их. В некоторой степени я решил эту проблему созданием временной копии файла, куда пошагово в цикле копируются все записи кроме удаленной. После чего оригинал и его временная копия закрываются. Оригинал удаляется, а копии присваивается имя оригинала. Неужели нет менее трудоемкого способа, каких нибудь функций удаления? Я нигде не нашел. Это сообщение отредактировал(а) PsiMagistr - 25.4.2010, 16:37 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| ~FoX~ |
|
|||
![]() НЕ рыжий!!! ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2819 Регистрация: 8.10.2003 Где: Зеленоград Репутация: 5 Всего: 68 |
Нету... тока руками....
Переходи на ini, xml или mdb |
|||
|
||||
| Mikel |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Ну удаление можно, например, сделать так... Найти в файле запись которую надо удалить, записать на ее место последнюю запись и уменьшить размер файла (если порядок элементов не важен). Либо читать сразу все записи в массив/список с ним работать и по завершении работы переписывать файл.
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Можно в записи хранить дополнительный байт для флагов записи. Скажем если там будет записана единица то запись живая, если 0, то помеченная как удаленная. При загрузке создаешь список позиций где удаленные записи. Если нужно записать новую запись выбираешь любую запись помеченную как удаленную и записывать туда данные, после чего флаг меняешь на единицу и удаляешь ее индекс из массива удаленных записей.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 31 Всего: 484 |
Более трудоёмкий способ есть всегда.
Например - писать на ассемблере... |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Спасибо, Fox, спасибо Mikel, спасибо Alexeis, спасибо Snowy. Ваша помощь неоценима. Snowy, ошибку исправил, так что ASM пролетает. )))))
Способы тяжеловатые, увы. Как же это разрабы не додумались до какой нибудь Delete(f, position), просто жалко. Я как прикину что в файле 10 000 записей. Это ж застрять посреди любого цикла как пить дать... Ребята, а где можно прочитать про MDB подробную статью или книжку хорошую? Чую, придется на базы данных садиться вплотную. Это сообщение отредактировал(а) PsiMagistr - 23.4.2010, 11:40 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 31 Всего: 484 |
Так уж устроены файлы, что сделать Delete в них невозможно.
Можно отпилить конец файла или нарастить его. Можно переписать часть файла. Но вырезакть кусок из середины невозможно физически. Самый простой вариант, как уже говорилось, взять последнюю запись и записать её на место удалённой. А файл укоротить на одну запись путём отрезания хвоста. Так нарушается очерёдность записей, но зато самый простой и быстрый путь. Путь, предложенный Alexeis'ом - типичный для баз данных. Они физически не удаляют запись, а просто помечают её, типа - это не трогаем - оно не считается. Такой подход полезен при частых удалениях. Можно 300 раз пометить, а потом в конце дня, например, переписать весь файл, не включая помеченные записи. |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Насколько я понимаю записать в середину файла тоже затруднительно. Даже если выставить указатель Seek(f, position) в нужное положение, нижняя половина файла срежется. Т.е. мы запишем как бы в конец...
Верно или нет? -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Работает запись в середину. Ошибка скорее всего в коде. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 31 Всего: 484 |
Чтоб я помнил.
Попробуй... Я просто давно не пользовался древними механизмами записи - уже не помню. Стримы точно не отрезают, если не приказать. Добавлено через 35 секунд Что-то я сегодня везде не успеваю ответить |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Точно так. Запись в середину прекрасно работает. Alexeis совершенно прав. Наверно я с флагами удаление сделаю, по Вашему методу. Плюс флаг можно в любой момент вернуть, пока окончательно запись не стер.
Snowy, да я сам недавно начал пользоваться. Ваяю одну игрушку-самоделку. Решил начать с механизмов сохранения. У меня удаление проходит через копию файла, куда пошагово через цикл пишем записи, окромя удаленных. Копия потом замещает оригинал само собой. Все работает, но выглядит стремно... Я сам этого кода боюсь. Частое обращение к диску. Файл не закрывается на протяжении всей работы. При загрузке файла определенное поле всех записей заносится в список (ListBox). Перемещение по пунктам этого списка, соответственно считывает нужную запись прямо из файла и выводит в в текстовые поля для возможного редактирования. Насколько это вредно для ПК мотыляться туда сюда по диску при каждом щелчке на нужный пункт списка? Это сообщение отредактировал(а) PsiMagistr - 23.4.2010, 15:44 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 31 Всего: 484 |
Да ни на сколько не вредно.
Файловые операции во-первых кэшируются операционкой, во-вторых самим диском. Система расчитана на такие действия - для неё это обычное дело. Никакого криминала тут нет. |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
У себя на пробу реализовал удаление с флагами . Биг спасибо, Alexeis. Существенно подправил кусочек кода здесь на странице. Компилятора нет под рукой, но думаю теперь все работает как должно.
Наверно перейду на ini. Возни меньше. -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Насколько я знаю для ini файлов есть ограничение на 64кб. Кроме того доступ гораздо медленнее, ведь для прочтения любой строки из середины требуется анализ всех вышестоящих строк. Запись фиксированного размера позволяет обращаться по индексу прямо считывая из нужного места блок, а не разбирая половину файла. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| PsiMagistr |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 479 Регистрация: 31.12.2009 Репутация: 1 Всего: 1 |
Вы имеете ввиду запись типа record? В Windows 98 ограничение на размер ini-файла точно существует. В Хр и выше система ограничивать не должна. Но вот не запутается ли сам дядюшка компилятор... Большой вопрос. Это сообщение отредактировал(а) PsiMagistr - 25.4.2010, 17:27 -------------------- "Арфы нет? Возьмите бубен! Ребята, будем жить!" (с) "В бой идут одни старики" --- "ИЕ" - один из самых сумасшедших браузеров в нашей галактике. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |