Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.012 c
15-1137094072
Gero
2006-01-12 22:27
2006.02.05
Рисование фигур с антиалиасингом


1-1135933959
_RusLAN
2005-12-30 12:12
2006.02.05
Ошибка при передаче формулы в EXCEL


15-1137182489
LordOfRock
2006-01-13 23:01
2006.02.05
Total Commander Plugin


1-1135772527
kyn66
2005-12-28 15:22
2006.02.05
Как набрать правильно массив случайных чисел?


2-1137666070
olevacho_
2006-01-19 13:21
2006.02.05
Автоматическое переключение языка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский