![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение файлов от конца к началу [D7, WinXP]
X_Tra © (2005-03-15 20:04:00)Вот тут такой вопрос меня интересует.
Насколько я знаю, все существующие в Дельфи функции/процедуры чтения файлов читают блок байт из файла от начала блока к концу и переводят файловый указатель вперёд, устанавливая его на позицию сразу после конца блока.
Хотелось бы узнать, можно ли эту операцию обратить, то есть: прочитать блок байт с конца к началу, сразу заполняя буфер соответствующим образом? А можно ли таким же образом организовать запись в файл? Если можно, то как?
Defunct (2005-03-17 20:11:00) [1][33]
Это без учета кеширования.
Defunct (2005-03-17 20:04:00) [2]X_Tra © (17.03.05 18:36) [32]
Поверьте, Ваша затея не стоит того чтобы за нее браться.
> как работает FileClose?
При закрытии FileHandle ОС сбрасывает на диск буфер файла. Объем буфера кратен объему сектора (512байт), буфер может быть разного размера зависит от ОС и ее настроек от (минимум) одного сектора (DOS) до, хм боюсь соврать ибо не знаю сколько в WinXP но однозначно не меньше одной страницы ОП (4kb).
Таких ситуаций как Вы предположили, что мол после сбоя (откл. питания) незакрытый файл вернется к начальному состоянию - 50/50. Зависит от ветра в поле. Если записывалось больше информации чем объем буфера, то часть информации в файл попадет а часть - нет.
X_Tra (2005-03-17 18:36:00) [3]> Потому, что они совсем не наплевательски сделаны.
{Здесь подразумевается, что моя программа сделана наплевательски - это по меньшей мере не тактично}
> Но ооочень кратковременные! При том, там нет такого места, чтобы потерялся 4 гиговый файл.
Да что Вы говорите: если будет нарушена связь хотя бы одного кластера, файл уже потерян.
Ладно, а как насчёт программ переразбивки дисков без потери данных (типа Partition Magic)? Они ведь тоже так работают
> Я не знаю, о каких редакторах речь, но более чем уверен - что есть.
Имеются ввиду такие программы, которые позволяют открыть любой файл любого размера как текст (как Блокнот, например), изменить его и сохранить. По идее, если такие программы есть, то Вы каждому её автору пошлёте гневное письмо с требованием закрыть проект из-за высокой опасности потери данных? Даже если бы я и нашёл такую программу, то не использовал бы её, так как не уверен на 100% в правильности алгоритма другого программиста. Я и своей программе не доверяю, всегда файл отката делаю
> настоятельный совет: не отдавайте никому!!!
Да успокойтесь Вы, НЕ БУДУ Я ВЫКЛАДЫВАТЬ ЭТУ ПРОГРАММУ на всеобщий доступ. Я Вас не заставляю её использовать, не настаиваю на своём алгоритме, я вообще Вас про это не спрашивал: если я сам увижу, что низкоуровневый доступ к жёсткому диску очень сложно осуществить, то брошу эту затею. Но для этого я хочу найти некоторую техническую информацию. Если Вы не знаете, где её найти, не пишите ничего!
KSergey (2005-03-17 08:07:00) [4]> [30] X_Tra © (16.03.05 22:47)
> Почему? А как насчёт дефрагментаторов?
> системами. Там тоже есть опасность рубильника Чубайса, но
> никто на это не ругается
А знаете почему? Потому, что они совсем не наплевательски сделаны.
В принципе, там, конечно, есть узкие места, увы. Но ооочень кратковременные! Вот в чем фокус. При том, там нет такого места, чтобы потерялся 4 гиговый файл.
> [30] X_Tra © (16.03.05 22:47)
> Во-вторых, Вы можете навскидку назвать парочку программ-редакторов,
> которые умеют быстро работать с файлами любого размера и
> выполнять операции такого типа?
Я не знаю, о каких редакторах речь, но более чем уверен - что есть.
А на счет времени - вот когда потеряется ценный материал из файла и возможные пользователи сего чудо-софта (настоятельный совет: не отдавайте никому!!!) придут пинать ногами - не говорите, что вас не предупреждали.
X_Tra (2005-03-16 22:47:00) [5]> Вы всерьез полагаете, что до столь простой вещи додумались первым в мире?
Вовсе нет, с чего Вы это взяли? Я такого не говорил, я как раз и думал, что, возможно, кто-то на этом форуме с этим имел дело, и поэтому задал вопрос
> С этого и надо начинать.
Ну и как это узнать? Они не скажут. Может, Вы знаете, как работает FileClose? Как именно эта функция освобождает хендл файла?
> Так почему же так не делает ни одна серьезная программа?
Во-первых, моя программа не претендует на то, чтобы перейти в раздел профессиональных - я программист-любитель.
Во-вторых, Вы можете навскидку назвать парочку программ-редакторов, которые умеют быстро работать с файлами любого размера и выполнять операции такого типа? В основном, все программы виснут, если только попытаться открыть в них файл размером больше 20-30 МБ (а то и всего 5 МБ), не говоря уже о том, чтобы его отредактировать и сохранить. Именно потому, что я не нашёл такой программы, пришлось писать свою. Ни одна серьёзная программа-редактор так не делает, потому что не рассчитана на файлы большого размера - для маленьких файлов проще всего использовать временный файл или разместить весь файл в памяти и там с ним работать...
> И более - так не надо работать в многопрограммных/многопользовательских системах.
Почему? А как насчёт дефрагментаторов? Они ведь на уровне кластеров работают, и прекрасно уживаются с многопрограммными/многопользовательскими системами. Там тоже есть опасность рубильника Чубайса, но никто на это не ругается
Anatoly Podgoretsky (2005-03-16 21:39:00) [6]И более - так не надо работать в многопрограммных/многопользовательских системах.
Набережных С. (2005-03-16 21:36:00) [7]
> X_Tra © (16.03.05 21:19) [26]
Вы всерьез полагаете, что до столь простой вещи додумались первым в мире? Так почему же так не делает ни одна серьезная программа?
> хотя это надо поточнее узнать в Microsoft
С этого и надо начинать.
> Просто Джо © (16.03.05 21:24) [27]
Третье.
Просто Джо (2005-03-16 21:24:00) [8]
> > Нет, это намек на наплевательское отношение к вопросу
> надежности.
> Что Вам не нравится: изменения сохраняются в файл, только
> если выполнить FileClose. Если вдруг произойдёт внезапное
> отключение питания, или кто-то убьёт процесс во время выполнения
> файловой операции, файл не сломается, не испортится и не
> удалится, так как функция FileClose не была выполнена. FileClose
> как раз и записывает окончательную информацию о файле в
> файловую таблицу (хотя это надо поточнее узнать в Microsoft).
Это не совсем так. Или не всегда так. Или даже совсем не так.
X_Tra (2005-03-16 21:19:00) [9]> Нет, это намек на наплевательское отношение к вопросу надежности.
Что Вам не нравится: изменения сохраняются в файл, только если выполнить FileClose. Если вдруг произойдёт внезапное отключение питания, или кто-то убьёт процесс во время выполнения файловой операции, файл не сломается, не испортится и не удалится, так как функция FileClose не была выполнена. FileClose как раз и записывает окончательную информацию о файле в файловую таблицу (хотя это надо поточнее узнать в Microsoft).
> Это радует. Только не передумай.
Не надо язвить, я не собирался и не собираюсь эту программу выкладывать в инете, не собираюсь её shareware делать, просто надеялся, что кто-то что-то знает или поможет мне найти дополнительную информацию. Вы же меня пытаетесь разубедить, что то, что я делаю, невозможно, а когда выясняется, что возможно, Вы сразу подразумеваете, что я сделал это с грубыми ошибками, и Вы ни в коем случае бы не стали использовать мою программу и никому бы этого не порекомендовали. Очень странный подход... :-\
Набережных С. (2005-03-16 20:54:00) [10]
> X_Tra © (16.03.05 20:29) [24]
Нет, это намек на наплевательское отношение к вопросу надежности.
> this program is for private use only
Это радует. Только не передумай.
> Anatoly Podgoretsky © (16.03.05 20:24) [23]
А что делать?:(
X_Tra (2005-03-16 20:29:00) [11]> Набережных С. © (16.03.05 20:12) [22]
Это намёк на мою некомпетентность, что ли? Ну-ну... Отличный разговор на форуме :-(
Не беспокойтесь, this program is for private use only...
Anatoly Podgoretsky (2005-03-16 20:24:00) [12]Предусмотрительный какой :-)
Набережных С. (2005-03-16 20:12:00) [13]
> X_Tra © (16.03.05 19:55) [21]
Ты бы сообщил, какую программу пишешь. Ну на всякий случай, вдруг столкнусь
X_Tra (2005-03-16 19:55:00) [14]> Набережных С. © (16.03.05 19:49) [20]
Волков бояться - в лес не ходить:)
Поэтому и хочу через кластеры сделать
Набережных С. (2005-03-16 19:49:00) [15]
> X_Tra © (16.03.05 19:28) [18]
А Чубайс c рубильником?
X_Tra (2005-03-16 19:43:00) [16]Дело в том, что я хочу ускорить этот процесс непосредственным обращением к файловой таблице и кластерам, но пока не знаю, как это сделать...
Ведь, насколько я знаю, файлы могут быть фрагментированы, и необязательно, что следующий кластер, относящийся к файлу, будет расположен физически на диске после предыдущего кластера от этого же файла: он может быть расположен и раньше предыдущего.
X_Tra (2005-03-16 19:28:00) [17]> Не делай. Но иначе не получится.
Да ё-моё, всё уже давно работает, и именно таким методом: открываем файл размером в 4 ГБ и удаляем оттуда маленький блок в самом начале - операция длится около двух минут без использования временного файла, поблочным перемещением хвоста после блока влево и последующим SetEndOfFile. А если удаляем блок ближе к концу, то вообще операция почти моментально проходит! То же самое со вставкой блока в файл. А если использовать временный файл, то во-первых, длительность операции будет фиксированной для конкретного размера блока и файла, а во-вторых, будет требоваться дополнительное дисковое пространство - два существенных минуса!
Игорь Шевченко (2005-03-16 19:18:00) [18]X_Tra © (16.03.05 19:15) [14]
> Я не хочу этого делать
Не делай. Но иначе не получится.
Alexander Panov (2005-03-16 19:16:00) [19]X_Tra © (16.03.05 19:15) [14]
Я не хочу этого делать,
По-другому никак.
Alexander Panov (2005-03-16 19:16:00) [20]Игорь Шевченко © (16.03.05 19:07) [13]
А как иначе?