-
Здравствуйте!
Подскажите пожалуйста, как можно удалить запись типа record в не типизированном файле. О том как писать, читать и перезаписывать с этим нет проблем, но как удалять?
-
> seferot (03.02.2009 15:01:00) [0]
А говоришь нет проблем.
-
> О том как писать, читать и перезаписывать с этим нет проблем, > но как удалять?
Только читая и перезаписывая. При этом возможны варианты.
-
> seferot © (03.02.09 15:01)
> как писать, читать и перезаписывать с этим нет проблем, но как удалять?
Чтобы что-то удалить из ЛЮБОГО файла, его как раз нужно перезаписать. А с этим, как Вы сказали, проблем нет.
-
> Юрий Зотов (03.02.2009 15:45:03) [3]
Видимо нет, раз не удаляется.
-
>Юрий Зотов © (03.02.09 15:45) [3] >Чтобы что-то удалить из ЛЮБОГО файла, его как раз нужно перезаписать.
Неужели ?
-
> seferot © (03.02.09 15:01)
Введи в запись дополнительное поле "Удалена". При чтении записей из файла, пропускай те у которых пометка "Удалена". Можно еще в первую очередь писать новые записи на место удаленных. Правда, возможно, в этом случае файл будет занимать место несколько большее, чем в нем реально полезной информации, но это тоже не страшно - надо лишь в программе сделать функцию - упаковать базу.
Если все описанное выше сложно, то придется полностью перезаписывать файл.
-
> как можно удалить запись типа record в не типизированном > файле
найти смещение записи в файле поставить указатель файла на смещение + размер записи прочитать файл до конца вернуть указатель на смещение записи в файле записать прочитанный кусок файла
это если непосредственно в файле, к тому же будет неэффективно при удалении нескольких записей. Если же файл полностью засосан в память, да и записей нужно удалить несколько, то проще удалить в памяти и перезаписать
-
> MsGuns © (03.02.09 16:18) [5]
Если Вам известен другой способ, был бы признателен за ликбез.
-
> найти смещение записи в файле > поставить указатель файла на смещение + размер записи > прочитать файл до конца > вернуть указатель на смещение записи в файле > записать прочитанный кусок файла
Есть ли примерчик?
-
-
>Юрий Зотов © (03.02.09 17:09) [8] >Если Вам известен другой способ, был бы признателен за ликбез.
Мой вопрос был совершенно серьезным. Многие СУБД (не только скл-серверные) при внесении изменений в таблицы (или метаданные) не переписывают ВЕСЬ файл БД, а лишь его "куски". Право, странно было бы если бы сервер, удаляя запись из какой-нибудь таблицы (или вставляя), переписывал бы весь файл БД, размеры которого могут достигать теребайтов и который может находиться физически на разных дисках и даже ПК. Хотя, надо учесть, что в БД несколько необычная по сравнению с ФС система организации данных.
-
> MsGuns © (04.02.09 09:59) [11]
> надо учесть, что в БД несколько необычная по сравнению > с ФС система организации данных.
Вот именно. В частности, удаляемая запись может и вовсе не удаляться, а только помечаться, как удаленная - и ее физическое удаление произойдет только при сжатии БД (backup и т.п.), что обнозначно сопрвождается все той же перезаписью файла. Причем, пометка эта может ставиться даже не в том файле, который хранит сами данные, а в совершенно другом, да каждый сервер может решать вопросы оптимизации по-своему - вплоть до работы с диском на физическом уровне.
Что же касается вставки и обновления записей, то к сабжу это не относится.
Продолжая Вашу логику, следовало бы начать с того, что файл - это всего лишь поименованная совокупность данных с определенной организацией и потому операцию удаления может и вовсе не поддерживать (например, с точки зрения программы, COM-порт - это тоже файл и работа с ним ведется через все те же файловые функции).
Но в данном случае речь идет о конференции "Начинающим" и самом обыкновенным дисковом файле. Поэтому в данном топике вряд ли уместно пускаться в пространные рассуждения о том, что есть файл вобще и как с ним можно работать вообще - поскольку это приведет лишь запудриванию мозгов человеку, который задал простой конкретный практический вопрос и хотел бы получить на него простой конкретный практический ответ.
А уж всяческого рода загибания пальцев здесь и тем более неуместны. Причем, насколько помню, Вы и сами придерживаетесь этой же точки зрения - по крайней мере, на словах.
-
Юрий, ни о каком "загибании пальцев" и мысли не было. Вы употребили слово "любой" и даже для усиления выделили его. Учитывая, что к Вашим постам здесь отношение особенное, я и задал вопрос.
ИМХО, Вы ответили правильно в отношении БОЛЬШИНСТВА файлов FAT-32, за обновление который "отвечает" сам винда. Однако в ОБЩЕМ случае Ваше УТВЕРЖДЕНИЕ неверно. И ссылаться на то, что новичку и не нужны "лишние" детали по-моему некорректно.
-
> MsGuns © (04.02.09 12:49) [13]
Не будем спорить. Позволю себе лишь заметить, что было бы совсем неплохо, если бы текст поста [5] был не таким, коков он есть, а состоял из второго абзаца поста [13] (без последнего предложения) и, в качестве примера, текста поста [11] (без первого предложения).
Это позволило бы избежать ненужного... :о)
-
> Однако в ОБЩЕМ случае Ваше УТВЕРЖДЕНИЕ неверно.
Что-то я не догоняю, каким образом оно может быть неверно. Разве только в случае написания собственного менеджера по работе с файловой системой (да и то не факт). Что выглядит, мягко говоря, несколько экстравагантным не только в рамках конференции "Начинающим", но даже и для "продвинутых"
-
> Ega23 (04.02.2009 13:15:15) [15]
Например файл может быть ReadOnly и быть последовательным.
|