Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
ВнизНе могу открыть файл в дин. массив Найти похожие ветки
← →
mazepa (2002-07-03 01:42) [0]Необходимо открыть файл размером от 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;
Что делать?
Заранее благодарен.
← →
Almaz (2002-07-03 01:58) [1]
> Что делать?
Использовать проецируемые в память файлы (см. функции CreateFileMapping и MapViewOfFile)
Удачи.
← →
NailMan (2002-07-03 03:03) [2]Реально быстро можно с помощью FileMapping.
Подробнее если хоть немного в ладах с англицким смотри на:
www.flipcode.com/tutorials/tut_filemapping.shtml
Если с языком никак:
В принципе и PROMT 2000 GIGANT нормально его переводит(хотя
если его немного подучить)
Таким способом хоть к xГб файлам доступ имеешь.
← →
T'Mon (2002-07-03 03:34) [3]При выполнении
BlockRead(FF,Buf,fsize,NumRead)
ты считываешь данные не буфер, который выделил под массив, а то место где храниться указатель на него. Тебе надо написатьBlockRead(FF, Pointer(Buf)^, fsize, NumRead)
. И так как ты объявил FF как просто файл, то читаться будет блоками по 128 байт. Т.е. тебе надо fsize подогнать к этому или обнявить FF как File of Byte;
← →
Aleks1 (2002-07-03 03:44) [4]Я думаю, в подобных случаях, лучше всего писать так:
BlockRead(FF,buf[0],fsize,NumRead);
← →
NailMan (2002-07-03 08:30) [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) - отстой еще тот, глюкавый изначально.
← →
Yuri-7 (2002-07-03 08:49) [6]Зачем так все сложно? Используй какой-нибудь TStream, загружай туда файл и тебе доступен любой байт.
← →
mazepa (2002-07-03 08:52) [7]Yuri-7 будь добр просвети что такое TStream и как его едят?
← →
Anatoly Podgoretsky (2002-07-03 09:00) [8]Класс, предназначенный для работы с абстрактными потоками, тебе нужен его наследник TFileStream
← →
Yuri-7 (2002-07-03 09:03) [9]Посмотри в HELP TFileStream, TMemoryStream.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.07.15;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c