Главная страница
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.029 c
2-1137521214
Vavan
2006-01-17 21:06
2006.02.05
Запись в риестр Windows


1-1135880057
___SED
2005-12-29 21:14
2006.02.05
Можно ли написать на делфи 64-х битную прогу?


1-1136640439
01
2006-01-07 16:27
2006.02.05
Защита ресурсов программы


15-1136385920
iamdanil
2006-01-04 17:45
2006.02.05
3.1415926535897932...


15-1136978114
syte_ser78
2006-01-11 14:15
2006.02.05
винт с 16Мб кеша