2013-07-17 1 views
4

Я пытаюсь отлаживать программу, которая управляет файлом. Например, я установил указатель файла на смещение 4 (с использованием базы 0), но, похоже, вместо этого он начинается со смещением 5.Нет ли функции API Windows GetFilePointer (Ex)?

Чтобы попытаться выяснить, что происходит, я хочу поместить строку для печати текущего указателя файла (я не использую IDE для этого небольшого проекта, просто Notepad2 и командной строки). К сожалению, не существует функции Windows API для извлечения текущего указателя файла, только один для его установки.

Я помню, что могу найти текущий указатель файла в Pascal (в DOS), но как определить текущий указатель файла на C++ в Windows?

+0

(Для записи, оказалось, что он работает правильно; Я просто использовал неверный тестовый файл. После того, как я закончил тестирование режима на основе размера, я начал тестировать режим на основе смещения и забыл начать использовать тестовый файл на основе смещения вместо тестового файла на основе размера. Doh! ' > _ <') – Synetech

ответ

15

В отличие от большинства функций, которые обеспечивают как приемник, так и сеттер (в смысле чтения-записи), действительно нет GetFilePointer или GetFilePointerEx.

Однако значение может быть получено по телефону SetFilePointer(Ex). Две функции SetFilePointer возвращают возврат/вывод от SetFilePointer, но вы должны обязательно указать смещение 0, иFILE_CURRENT в качестве режима. Таким образом, он перемещает 0 байт из того места, где он есть, а затем возвращает (я не могу ручаться за то, тратит ли процессорные циклы и ОЗУ на нулевой ход, но я думаю, что они оптимизированы, чтобы этого не делать).

Да, это непоследовательно и сбивает с толку (и излишними и плохо разработаны), но вы можете обернуть его в своей собственной GetFilePointer(Ex) функции:

DWORD GetFilePointer (HANDLE hFile) { 
    return SetFilePointer(hFile, 0, NULL, FILE_CURRENT); 
} 


LONGLONG GetFilePointerEx (HANDLE hFile) { 
    LARGE_INTEGER liOfs={0}; 
    LARGE_INTEGER liNew={0}; 
    SetFilePointerEx(hFile, liOfs, &liNew, FILE_CURRENT); 
    return liNew.QuadPart; 
} 
+1

Ни одна из ваших реализаций не содержит обработку ошибок. Первый из них тихо проваливается для файлов размером более 4 ГБ. Ни один из них не нужен. – IInspectable