![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как реализовать динамический буффер в BlockRead? [D6, WinXP]
guard_gg © (2006-06-17 00:14:00)Как реализовать динамический буффер в BlockRead?
Я хочу что бы весь файл грузился за один заход. Реально ли это?
Procedure SomeProcedure;
Var
Buf : array of Char;
F : File;
FSize,
Readed : LongWord;
Begin
AssignFile(F, ‘test.gpp’);
Reset(F, 1)
FSize := FileSize(F);
SetLength(Buf, FSize); // До энтого момента все прекрасно, Buf = (#00, #00, #00, ... )
BlockRead(F, Buf, FSize, Readed); // А после этой процедуры "умирает" Buf = ()
if buf[1] = #13 then ... // Здесь возникает вполне понятное исключение, но вопрос был не в этом.
...
...
...
End;
guard_gg (2006-06-18 03:38:00) [1]Вот так с "Classes" скомпилированный проект неожиданно вырос
c 8kb до 113kb =), не, мне такое точно не подходит. Я и так
за каждый киллобайт exe-шника борюсь.
to Rial;
{
BlockRead(F,Pointer(Buf)^, FSize, Readed);
Buf - это указатель на массив. То есть в Вашем коде считываются данные
не в сам массив, а в 4-байтный указатель, и в область
памяти, находящуюся ЗА ним, а не ту, НА КОТОРУЮ он указывает.
}
Спасиб, дошло как юзать blockread.
Я просто немного запутался по началу с pointerami, теперь понял
что buf сразу является указателем на массив.
Я вначале вообще планиравал
New(buf);
...
Dispose(buf);
Потому и написал что ошибся когда тему набирал - нет не ошибся
В общем спасиб те большое!
Еще хотелось бы задать пару вопросов:
1. Как программным способом можно узнать размер кластера файловой системы?
2. Не подскажет ли кто-нибудь ссылку на документацию к ассемблеру.
Не знаю с чего лучше начать изучение ентой темы.
Defunct (2006-06-17 12:52:00) [2]Leonid Troyanovsky © (17.06.06 12:31) [29]
Ок, принял к сведению.
спасибо за разъяснение. ;>
Leonid Troyanovsky (2006-06-17 12:31:00) [3]
> Defunct © (17.06.06 12:05) [28]
> Ну правила, само собой. А вот то, что я обязан пояснять
> свои ответы, тому с кем вообще не хочу разговаривать?? это
Не. Нужно быть готовым обосновать свои высказывания всегда.
И не важно, по чьему требованию.
Бо, обсуждения публичные, несмотря на адресность ответов,
а целью здешнего общения является, IMHO, избавление его
участников от ошибочного восприятия действительности
(данной нам в Delphi).
Т.е., All безразличны какие-то межличностные отношения
участников обсуждения, а важна лишь истина.
Кстати, именно поэтому, человек задавший первоначальный
вопрос (или автор топика) не имеет на него (топик) каких
либо особенных прав. Но, это так, к слову.
--
Regards, LVT.
Defunct (2006-06-17 12:05:00) [4]Leonid Troyanovsky © (17.06.06 11:35) [27]
> Нет уж. Т.е., есть этикет, ну, или, скажем, правила общения.
Общаешься с All - будь любезен придерживаться.
Иначе и общения не получится.
Ну правила, само собой. А вот то, что я обязан пояснять свои ответы, тому с кем вообще не хочу разговаривать?? это уже сверх правил IMHO.
Допустим, что форма изложения тебя чем-то раздражает,
однако, по существу-то все верно. Не так ли?
Со стороны b..e? Нет не так.
насчет [26] возможно вам лучше удалось изложить мысль, чем мне.
Leonid Troyanovsky (2006-06-17 11:35:00) [5]
> Defunct © (17.06.06 10:56) [23]
> ps: и никому, ничего я здесь не обязан.
Нет уж. Т.е., есть этикет, ну, или, скажем, правила общения.
Общаешься с All - будь любезен придерживаться.
Иначе и общения не получится.
> Defunct © (17.06.06 11:23) [25]
Допустим, что форма изложения тебя чем-то раздражает,
однако, по существу-то все верно. Не так ли?
--
Regards, LVT.
Leonid Troyanovsky (2006-06-17 11:26:00) [6]
> Defunct © (17.06.06 10:55) [22]
> Относится к тому, что TFileStream много ближе к WinAPI хотя
> бы тем, что названия методов созвучны API функциям, а реализация
> использует непосредственно Api функции.
Дык, реализация всех паскалевских i/o также использует WinAPI.
Ну, а ближе-дальше - здесь на столько тонко, что не дает
уверенности в "лучше работает".
Т.е., правильно сформулированный ответ выглядел бы примерно так:
начинающим (одним из которых, по всей видимости, является вопрошающий)
не стоит пользоваться ни паскалевскими функциями в/в, так как они их,
все равно, не знают, ни WinAPI, а сосредоточится на изучении TStream и
его потомков, бо это проще и полезней для них, а каких либо потерь
эффективности против WinAPI они (на этапе обучения) и не заметят
(на фоне большого количества неэффективностей другого рода).
Вот последнее тебе удалось раскрыть, правда, не сразу :)
--
Regards, LVT.
Defunct (2006-06-17 11:23:00) [7]Удалено модератором
begin...end (2006-06-17 11:20:00) [8]> Defunct © (17.06.06 10:55) [22]
>> Поверьте TFileStream будет работать куда лучше чем задуманная
>> вами галиматья с BlockRead
> Относится к тому, что TFileStream много ближе к WinAPI
LOL. Вы ясно сказали: "TFileStream будет работать куда лучше". Из того, что TFileStream якобы "ближе к WinAPI", вовсе не следует, что TFileStream будет лучше работать .
> ближе к WinAPI хотя бы тем, что названия методов созвучны
> API функциям
То есть если я напишу свою функцию ReadFile, в которой буду только вызывать BlockRead, то моя функция окажется ближе к WinAPI, чем BlockRead? LOL.
> реализация использует непосредственно Api функции
LOL. Открою секрет -- BlockRead/BlockWrite тоже используют API-функции. Причём те же самые, что и TFileStream.
Итого: LOL. 3 раза.
Defunct (2006-06-17 10:56:00) [9]> Leonid Troyanovsky
ps: и никому, ничего я здесь не обязан.
Defunct (2006-06-17 10:55:00) [10]Leonid Troyanovsky © (17.06.06 10:31) [20]
> Во-первых, не "могу", а "обязан", и не кому-то, а 2All.
Ок, По порядку.
> Глупость какая-то.
относится к [3]
>> Программирую практически только процедурами и функциями WinAPI.
Т.к. BlockRead не относится к WinAPI, а является приблудой Borland Pascal, которая перекочевала в Delphi для совместимости с более ранними версиями.
Далее:
> Поверьте TFileStream будет работать куда лучше чем задуманная вами галиматья с BlockRead
Относится к тому, что TFileStream много ближе к WinAPI хотя бы тем, что названия методов созвучны API функциям, а реализация использует непосредственно Api функции.
TFileStream является стандартым компонентом и присутсвует во всех версиях Delphi. Является очень удачной и простой в использовании оберткой над файловыми операциями, а также наследуется от TStream, что позволяет использовать его в качестве источника данных в очень многих уже написанных классах как VCL так и не VCL (например множество классов для работы с сетью могут в качестве данных использовать TStream). Множество разнообразных классов содержат метод LoadFromStream, в то время как многие наследники TStream включают метод LoadFromFile. Таким образом, единожды разобравшись с нехитрым TFileStream, автор вопроса может переключиться на класс, в котором его задача уже полностью реализована, а именно это класс TMemoryStreamс его чудесными методами LoadFromStream/LoadFromFile.
> Во-вторых, замечание уважаемого begin...end © было, IMHO,
Уважаемый в узких кругахbegin...end только и умеет, что делать замечания, якобы корректно и якобы содержательно.
Leonid Troyanovsky (2006-06-17 10:35:00) [11]
> begin...end © (17.06.06 10:30) [19]
А где выдержка?
--
Regards, LVT.
Leonid Troyanovsky (2006-06-17 10:31:00) [12]
> Defunct © (17.06.06 10:21) [17]
> Я могу обосновать сказанное, но только не begin...end. Т.
> к. очевидно, что он цепляется не к сказанному, а к сказавшему.
Во-первых, не "могу", а "обязан", и не кому-то, а 2All.
Во-вторых, замечание уважаемого begin...end © было, IMHO,
вполне корректно как по форме, так и по содержанию.
--
Regards, LVT.
begin...end (2006-06-17 10:30:00) [13]> Defunct © (17.06.06 10:21) [17]
Слив засчитан.
Leonid Troyanovsky (2006-06-17 10:27:00) [14]
> guard_gg © (17.06.06 01:10) [3]
> Программирую практически только процедурами и функциями
> WinAPI.
Ну, а к чему тогда BlockRead? Тогда уж ReadFile.
> guard_gg © (17.06.06 01:15) [4]
> Так есть способы заливать файл целиком, это всетаки гораздо
> быстрее?
Зависит от.
--
Regards, LVT.
Defunct (2006-06-17 10:21:00) [15]Leonid Troyanovsky © (17.06.06 10:11) [15]
> Однако, выдвинуть неочевидный тезис, время же нашлось?
> Как, собс-но, и желание не промолчать.
Я могу обосновать сказанное, но только не begin...end. Т.к. очевидно, что он цепляется не к сказанному, а к сказавшему.
begin...end © (17.06.06 10:11) [16]
Милый друг, скажу прямо, мне просто противно общаться конкретно с вами.
begin...end (2006-06-17 10:11:00) [16]> Defunct © (17.06.06 09:58) [14]
> на растолковывание не располагаю ни желанием, ни временем.
А ничего особенно растолковывать и не требуется. Требуется только сказать, чем использование TFileStream лучше использования BlockRead. Например, написать: "скорость", "простота кода" и т.д.
> приоткрывайте, вы ж написали, что знакомы.
Да, я знаком. Но таинственность напустил не я, а Вы. Поэтому и приоткрывать её -- Вам, а не мне. И объяснять, что Вы имели в виду в своём высказывании, можете Вы , но никак не я.
> подсказка - совместимость со всеми наследниками TStream
Спасибо за подсказку, но из неё, к сожалению, ничего не понятно. Во-первых, неясно, зачем нужна некая "совместимость" для задачи чтения файла в память. А во-вторых, неясно, откуда взяться этот самой "совместимости" со всеми наследниками TStream (если принять во внимание, что TFileStream является наследником T HandleStream).
Leonid Troyanovsky (2006-06-17 10:11:00) [17]
> Defunct © (17.06.06 09:58) [14]
> понятно, но на растолковывание не располагаю ни желанием,
> ни временем.
Однако, выдвинуть неочевидный тезис, время же нашлось?
Как, собс-но, и желание не промолчать.
--
Regards, LVT.
Defunct (2006-06-17 09:58:00) [18]> Зря надеетесь
понятно, но на растолковывание не располагаю ни желанием, ни временем.
> Приоткроем завесу таинственности, или как?
приоткрывайте, вы ж написали, что знакомы.
подсказка - совместимость со всеми наследниками TStream
begin...end (2006-06-17 09:33:00) [19]> Defunct © (17.06.06 09:27) [12]
Зря надеетесь, ибо сабж я, разумеется, уже прочитал. С тем, как работает TFileStream и BlockRead, я тоже знаком, и уже давно.
Так в чём выигрыш в случае TFileStream будет? Приоткроем завесу таинственности, или как?
Defunct (2006-06-17 09:27:00) [20]begin...end © (17.06.06 09:21) [11]
Читать сабж и станет ясно, надеюсь,
если с кодом TFileStream знакомы.