Конференция "Начинающим" » Удаление записи типа record. [D7, собственная]
 
  • seferot © (03.02.09 15:01) [0]
    Здравствуйте!

    Подскажите пожалуйста, как можно удалить запись типа record в не типизированном файле. О том как писать, читать и перезаписывать с этим нет проблем, но как удалять?
  • Anatoly Podgoretsky © (03.02.09 15:14) [1]
    > seferot  (03.02.2009 15:01:00)  [0]

    А говоришь нет проблем.
  • Amoeba © (03.02.09 15:43) [2]

    > О том как писать, читать и перезаписывать с этим нет проблем,
    >  но как удалять?

    Только читая и перезаписывая. При этом возможны варианты.
  • Юрий Зотов © (03.02.09 15:45) [3]
    > seferot ©   (03.02.09 15:01)  

    > как писать, читать и перезаписывать с этим нет проблем, но как удалять?

    Чтобы что-то удалить из ЛЮБОГО файла, его как раз нужно перезаписать. А с этим, как Вы сказали, проблем нет.
  • Anatoly Podgoretsky © (03.02.09 15:48) [4]
    > Юрий Зотов  (03.02.2009 15:45:03)  [3]

    Видимо нет, раз не удаляется.
  • MsGuns © (03.02.09 16:18) [5]
    >Юрий Зотов ©   (03.02.09 15:45) [3]
    >Чтобы что-то удалить из ЛЮБОГО файла, его как раз нужно перезаписать.

    Неужели ?
  • DVM © (03.02.09 16:19) [6]

    > seferot ©   (03.02.09 15:01)  

    Введи в запись дополнительное поле "Удалена". При чтении записей из файла, пропускай те у которых пометка "Удалена". Можно еще в первую очередь писать новые записи на место удаленных. Правда, возможно, в этом случае файл будет занимать место несколько большее, чем в нем реально полезной информации, но это тоже не страшно - надо лишь в программе сделать функцию - упаковать базу.

    Если все описанное выше сложно, то придется полностью перезаписывать файл.
  • clickmaker © (03.02.09 16:39) [7]
    > как можно удалить запись типа record в не типизированном
    > файле

    найти смещение записи в файле
    поставить указатель файла на смещение + размер записи
    прочитать файл до конца
    вернуть указатель на смещение записи в файле
    записать прочитанный кусок файла

    это если непосредственно в файле, к тому же будет неэффективно при удалении нескольких записей.
    Если же файл полностью засосан в память, да и записей нужно удалить несколько, то проще удалить в памяти и перезаписать
  • Юрий Зотов © (03.02.09 17:09) [8]
    > MsGuns ©   (03.02.09 16:18) [5]

    Если Вам известен другой способ, был бы признателен за ликбез.
  • seferot © (03.02.09 17:43) [9]

    > найти смещение записи в файле
    > поставить указатель файла на смещение + размер записи
    > прочитать файл до конца
    > вернуть указатель на смещение записи в файле
    > записать прочитанный кусок файла

    Есть ли примерчик?
  • Amoeba © (03.02.09 18:04) [10]
    Ознакомьтесь с этим
    http://www.delphikingdom.com/asp/viewitem.asp?catalogid=843
    и затем, пользуясь справкой сможете сами написать такой примерчик. И пользы будет больше, чем использовать готовенькое.
  • MsGuns © (04.02.09 09:59) [11]
    >Юрий Зотов ©   (03.02.09 17:09) [8]
    >Если Вам известен другой способ, был бы признателен за ликбез.

    Мой вопрос был совершенно серьезным. Многие СУБД (не только скл-серверные) при внесении изменений в таблицы (или метаданные) не переписывают ВЕСЬ файл БД, а лишь его "куски". Право, странно было бы если бы сервер, удаляя запись из какой-нибудь таблицы (или вставляя), переписывал бы весь файл БД, размеры которого могут достигать теребайтов и который может находиться физически на разных дисках и даже ПК. Хотя, надо учесть, что в БД несколько необычная по сравнению с ФС система организации данных.
  • Юрий Зотов © (04.02.09 12:21) [12]
    > MsGuns ©   (04.02.09 09:59) [11]

    >  надо учесть, что в БД несколько необычная по сравнению
    > с ФС система организации данных.

    Вот именно. В частности, удаляемая запись может и вовсе не удаляться, а только помечаться, как удаленная - и ее физическое удаление произойдет только при сжатии БД (backup и т.п.), что обнозначно сопрвождается все той же перезаписью файла. Причем, пометка эта может ставиться даже не в том файле, который хранит сами данные, а в совершенно другом, да каждый сервер может решать вопросы оптимизации по-своему - вплоть до работы с диском на физическом уровне.

    Что же касается вставки и обновления записей, то к сабжу это не относится.

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

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

    А уж всяческого рода загибания пальцев здесь и тем более неуместны. Причем, насколько помню, Вы и сами придерживаетесь этой же точки зрения - по крайней мере, на словах.
  • MsGuns © (04.02.09 12:49) [13]
    Юрий, ни о каком "загибании пальцев" и мысли не было.
    Вы употребили слово "любой" и даже для усиления выделили его. Учитывая, что к Вашим постам здесь отношение особенное, я и задал вопрос.

    ИМХО, Вы ответили правильно в отношении БОЛЬШИНСТВА файлов FAT-32, за обновление который "отвечает" сам винда. Однако в ОБЩЕМ случае Ваше УТВЕРЖДЕНИЕ неверно. И ссылаться на то, что новичку и не нужны "лишние" детали по-моему некорректно.
  • Юрий Зотов © (04.02.09 13:03) [14]
    > MsGuns ©   (04.02.09 12:49) [13]

    Не будем спорить. Позволю себе лишь заметить, что было бы совсем неплохо, если бы текст поста [5] был не таким, коков он есть, а состоял из второго абзаца поста [13] (без последнего предложения) и, в качестве примера, текста поста [11] (без первого предложения).

    Это позволило бы избежать ненужного...
    :о)
  • Ega23 © (04.02.09 13:15) [15]

    > Однако в ОБЩЕМ случае Ваше УТВЕРЖДЕНИЕ неверно.


    Что-то я не догоняю, каким образом оно может быть неверно.
    Разве только в случае написания собственного менеджера по работе с файловой системой (да и то не факт). Что выглядит, мягко говоря, несколько  экстравагантным не только в рамках конференции "Начинающим", но даже и для "продвинутых"
  • Anatoly Podgoretsky © (04.02.09 14:34) [16]
    > Ega23  (04.02.2009 13:15:15)  [15]

    Например файл может быть ReadOnly и быть последовательным.
 
Конференция "Начинающим" » Удаление записи типа record. [D7, собственная]
Есть новые Нет новых   [134479   +8][b:0][p:0.001]