Главная страница
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
1-47358
Юра
2002-07-02 02:03
2002.07.15
System Menu


4-47862
anod
2002-05-09 23:56
2002.07.15
Текст меню по идентификатору


1-47482
ricks
2002-07-03 12:58
2002.07.15
Диалоги из ресурсов


1-47329
dihlos
2002-07-01 13:31
2002.07.15
Как изменить обработчик сообщения WM_CLOSE у другого приложения


6-47633
BAHO
2002-03-28 20:09
2002.07.15
Мониторинг компов в локалке...