Вниз
Скачать: CL | DM;

Использование SetFilePointerEx.   Найти похожие ветки 

← →
Riply ©   (2007-07-01 01:27) [0]

Здравствуйте !
Подскажите, пожалуйста, как лучше поступить в такой ситуации:
Допустим нам надо установить "файловый поинтер" в новое значение - NewPointer.
NewPointer - ну очень болшое число :). Мы знаем, что в настоящее время,
"файловый поинтер" совсем рядом с NewPointer.
Какой из вариантов:
1. if SetFilePointerEx(Handle, 0, @OldPointer, FILE_CURRENT) then
   SetFilePointerEx(Handle, NewPointer - OldPointer, nil, FILE_CURRENT);
2. SetFilePointerEx(Handle, NewPointer, nil, FILE_BEGIN);
лучше выбрать ?
P.S.
Просто я не знаю, как "внутри себя" работает SetFilePointerEx :(


← →
KilkennyCat ©   (2007-07-01 03:29) [1]

Без разницы, наверное. Непонятно только, зачем проверка в 1.


← →
begin...end ©   (2007-07-01 09:11) [2]

Лучше выбрать второй вариант.


← →
Riply ©   (2007-07-01 10:36) [3]

> [1] KilkennyCat ©   (01.07.07 03:29)
>Без разницы, наверное. Непонятно только, зачем проверка в 1.
Там не проверка, а получение поинтера :)

>[2] begin...end ©   (01.07.07 09:11)
>Лучше выбрать второй вариант.
Спасибо.
А можно мотивировать это утверждение ?
Или оно "интуитивно ясно из общих соображений"(с) ? :)


← →
begin...end ©   (2007-07-01 12:29) [4]

> Riply ©   (01.07.07 10:36) [3]

Близость требуемой позиции файлового указателя к его текущей позиции на этапе исполнения SetFilePointerEx не имеет значения. Перемещение  указателя этой функцией сводится к вызову внутренней функции NtSetInformationFile, в которую должна передаваться требуемая абсолютная позиция указателя (смещение от начала файла).

С помощью отладчика легко убедиться, что в случае вызова SetFilePointerEx c флагом FILE_CURRENT внутри неё вначале будет вызвана NtQueryInformationFile, для определения текущего положения указателя и последующего вычисления абсолютного смещения. Если же использовать флаг FILE_BEGIN, вызова NtQueryInformationFile не потребуется.

Отсюда ясно, что первый вариант не только не принесёт никакого выигрыша в производительности, но даже и окажется медленнее второго варианта, из-за а) двойного вызова SetFilePointerEx; б) исполнения внутренних вызовов этой функции, ненужных в случае флага FILE_BEGIN.


← →
Riply ©   (2007-07-01 12:51) [5]

> [4] begin...end ©   (01.07.07 12:29)
Спасибо большое !



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.016 c
15-1183167604
iamgeorg
2007-06-30 05:40
2007.07.29
Как определить обороты вентилятора CPU?


2-1183640247
POP
2007-07-05 16:57
2007.07.29
64bit HEX преобразовать в DEC строку


1-1175271189
Углук
2007-03-30 20:13
2007.07.29
Как окрасить TChartSeries?


2-1182952331
prMan
2007-06-27 17:52
2007.07.29
прогрессбар


15-1183444792
IMHO
2007-07-03 10:39
2007.07.29
Проблема 2000 года...




   Наверх