Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу открыть файл в дин. массив [D6, Win95/98, NT4]


mazepa ©   (2002-07-03 01:42:00) 

Необходимо открыть файл размером от 100кб до 100Мб, естественно указать сразу buf:array[0..100..00] of byte будет неправильно...

var FF : File;
fsize : longint;
buf : array of byte;
NumRead : integer;
begin
if opendialog1.Execute then
begin
AssignFile(FF,opendialog1.FileName);
Reset(FF,1);
fsize:=FileSize(FF);
SetLength(buf,fsize);
BlockRead(FF,Buf,fsize,NumRead); << Результат: I/O Error 87
CloseFile(FF);
end;
end;

Что делать?
Заранее благодарен.


Yuri-7   (2002-07-03 09:03:00) [1]

Посмотри в HELP TFileStream, TMemoryStream.


Anatoly Podgoretsky   (2002-07-03 09:00:00) [2]

Класс, предназначенный для работы с абстрактными потоками, тебе нужен его наследник TFileStream


mazepa   (2002-07-03 08:52:00) [3]

Yuri-7 будь добр просвети что такое TStream и как его едят?


Yuri-7   (2002-07-03 08:49:00) [4]

Зачем так все сложно? Используй какой-нибудь TStream, загружай туда файл и тебе доступен любой байт.


NailMan   (2002-07-03 08:30:00) [5]

А вообще забей на старые ДОСовские хандлеры - у меня они
по жизни глючили. Используй мастдайные, типа:

var F:Integer;BRead,Size:Cardinal;
Buf:Pointer;
P:PByte;
begin
F:=FileCreate(FileName);
Size:=FileSeek(F,0,2); //Определяем длину если нужна
FileSeek(F,0,0);//Аналогично Reset(f)
...
ну а дальше выделяй переменную типа Pointer размером
каким хочешь, но лучше не более 2Мб(все равно на винтах кэш меньше, хотя у моего имхо такой), и читай так:
repeat
nread:=FileRead(F,Buf^,<Размер массива>);
If Nread>0 then begin
...
Испоьзуешь инфу типа так
P:=Buf;

P^ и тра-ля-ля
...
end;
until Nread=0;
...
FileClose(F);


Глючить не дОлжно - ханжлеры мастдайные - их навалом,
а старье всякое вроде File(of) - отстой еще тот, глюкавый изначально.


Aleks1   (2002-07-03 03:44:00) [6]

Я думаю, в подобных случаях, лучше всего писать так:
BlockRead(FF,buf[0],fsize,NumRead);


T'Mon   (2002-07-03 03:34:00) [7]

При выполнении BlockRead(FF,Buf,fsize,NumRead)ты считываешь данные не буфер, который выделил под массив, а то место где храниться указатель на него. Тебе надо написать BlockRead(FF, Pointer(Buf)^, fsize, NumRead). И так как ты объявил FF как просто файл, то читаться будет блоками по 128 байт. Т.е. тебе надо fsize подогнать к этому или обнявить FF как File of Byte;


NailMan   (2002-07-03 03:03:00) [8]

Реально быстро можно с помощью FileMapping.
Подробнее если хоть немного в ладах с англицким смотри на:
www.flipcode.com/tutorials/tut_filemapping.shtml

Если с языком никак:
В принципе и PROMT 2000 GIGANT нормально его переводит(хотя
если его немного подучить)

Таким способом хоть к xГб файлам доступ имеешь.


Almaz   (2002-07-03 01:58:00) [9]


> Что делать?

Использовать проецируемые в память файлы (см. функции CreateFileMapping и MapViewOfFile)

Удачи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо