Вниз
Скачать: 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.014 c
15-1183108690
Volcanic
2007-06-29 13:18
2007.07.29
Как объединить TreeView и ListView??


15-1183625889
@!!ex
2007-07-05 12:58
2007.07.29
Установка Linux виснет на форматировании винчестеров....


2-1183344188
Grademax
2007-07-02 06:43
2007.07.29
Как отследить "выключение системы"?


15-1183358074
Чародей
2007-07-02 10:34
2007.07.29
DirectX срочно


11-1166415709
SecurAdmin
2006-12-18 07:21
2007.07.29
KOL+ перетаскивание формы за любую ее точку




   Наверх