Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.15;
Скачать: CL | DM;

Вниз

Не могу открыть файл в дин. массив   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
14-47724
rhf
2002-06-09 13:31
2002.07.15
есть Кнут в формате TEX....


4-47868
Serd_hhc
2002-05-11 08:56
2002.07.15
Закрытие окна.


3-47089
Yong
2002-06-21 06:59
2002.07.15
Access+DBF


1-47405
BKV
2002-07-02 18:44
2002.07.15
Как включить scrollbar


14-47731
Nevercomes
2002-06-11 20:05
2002.07.15
Мастера, помогите пожалуйста!