Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-47265
ivlex
2002-06-29 10:30
2002.07.15
Шифрование


7-47839
Максим_
2002-04-23 15:02
2002.07.15
Текст разного цвета в DrawGrid


1-47600
nimble
2002-06-27 06:22
2002.07.15
Глюк


1-47373
FireWorks
2002-07-01 16:34
2002.07.15
Работа с dll


1-47566
Blacki
2002-06-27 21:55
2002.07.15
Как заскиновать ScrollBar in Memo





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский