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

Вниз

SetFilePointer не перемещает указатель файла за 2Гб   Найти похожие ветки 

 
jTommy   (2005-11-27 02:43) [0]

Мастера, помогите. Пишу программу, которая читает данные из файла. Если файл больше 2Гб и нужно переместить указатель за этот предел, SetFilePointer не срабатывает.
При включенном Range Checking случается исключение ERangeError, при выключенном - указатель просто не переходит на нужную позицию.
Код такой:
SetFilePointer(hArch, Int64Rec(DataOffset).Lo, Pointer(Int64Rec(DataOffset).Hi), FILE_BEGIN);
Попробовал написать через TFileStream - то же самое. :(


 
sniknik ©   (2005-11-27 03:09) [1]

> Pointer(Int64Rec(DataOffset).Hi)
не значение приведенное к указателю, а указатель на значение. в этом все дело , похоже.
т.е. @Int64Rec(DataOffset).Hi вместо этого.


 
Lamer@fools.ua ©   (2005-11-27 11:20) [2]

На Win2K и старше можно использовать SetFilePointerEx(). Она поудобнее будет.


 
jTommy   (2005-11-27 14:19) [3]

@sniknik:
Да, действительно, ты прав. В исходниках дельфи(функция FileSeek) точно также написано. Но у меня выдает ошибку "Variable required", приходится писать так:
n:=Int64Rec(DataOffset).Hi;
SetFilePointer(hArch, Int64Rec(DataOffset).Lo, @n, FILE_BEGIN);
странно это. Ладно, с этим разобрались, но проблема осталась...
После непродолжительного изучения исходников Дельфи решение было найдено. В функции SetFilePointer смещение имеет тип LONG что тоже самое, что и Integer. А поля Lo и Hi записи Int64Rec имеют тип Cardinal. Вот здесь-то вся и проблема. Переопределив запись Int64Rec:

 Int64Rec = packed record
   case Integer of
     0: (Lo, Hi: Integer);
     1: (Cardinals: array [0..1] of Cardinal);
     2: (Words: array [0..3] of Word);
     3: (Bytes: array [0..7] of Byte);
 end;

все правильно заработало.
Как я уже писал выше, такой прием используется в функции FileSeek. А она используется в TFileStream, получается, что все программы написанные на дельфи с использованием этого класса глючат с файлами больше 2Гб.


 
Lamer@fools.ua ©   (2005-11-27 17:13) [4]

>0: (Lo, Hi: Integer);
Это неправильно. Правильно так:
0: (Lo: LongWord; Hi: LongInt);



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.027 c
2-1137480519
СержК
2006-01-17 09:48
2006.02.05
Как узнать - сколько строк в текстовом файле?


15-1137360241
Bogdan1024
2006-01-16 00:24
2006.02.05
Шпоргалки


2-1137495442
V0va
2006-01-17 13:57
2006.02.05
Как заменить скроллбары в tmemo, tlistbox и тд на свой?


4-1132310115
Stany
2005-11-18 13:35
2006.02.05
отлов MessageBox а от определ. окна


3-1133879911
Sergey_Masloff
2005-12-06 17:38
2006.02.05
NVL для NUMERIC в FireBird