![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу открыть файл в дин. массив [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)
Удачи.