Текущий архив: 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.45 MB
Время: 0.011 c