Главная страница
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.03 c
6-1130508869
SergP.
2005-10-28 18:14
2006.02.05
Многократное срабатывание ServerSocket1ClientError


15-1137079767
Piter
2006-01-12 18:29
2006.02.05
На радость автомобилистам, на горе пешеходам :)


2-1137488065
rerbi
2006-01-17 11:54
2006.02.05
как добавить символ в строку


15-1137364378
wow
2006-01-16 01:32
2006.02.05
Просмотреть DLL - ку хочу


2-1137606210
STK
2006-01-18 20:43
2006.02.05
Почкму при запуске через D7 нет ошибки, а при обычном запуске ест