Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Указатели файлов



Windows для каждого открытого файла поддерживает указатель файла, обозначающий позицию текущего байта в файле. Следующая операция WriteFile или ReadFile на­чинает последовательное перемещение данных в файл или из файла с этой позиции и увеличивает указатель файла на количество переданных байтов. При открытии файла функцией CreateFile указатель обнуляется, указывая на начало файла, и продвигается вперед с каждой последующей операцией чтения или записи. Первое, что необходимо для прямого доступа к файлу, — это возможность установить указатель файла на произ­вольную позицию. Для этого предназначена функция SetFilePointer.

Данная функция демонстрирует, как Windows работает с 64-разрядной системой NTFS. Но эта методика не всегда хорошо подходит для SetFilePointer, поэтому SetFilePointer лучше всего применять для небольших файлов.

DWORD SetFilePointer (HANDLE hFile, LONG lDistanceToMove,

PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod);

Возвращаемое значение: младшая часть (DWORD без знака) нового указателя файла. Старшая часть нового указателя передается значению DWORD, на которое указывает lpDistanceToMoveHigh (если это не пустой указатель). В случае, ошибки функция возвращает значение 0xFFFFFFFF.

Параметры

hFile — дескриптор открытого файла с доступом для чтения или записи (или для обеих операций).

lDistanceToMove — значение, на которое перемещается указатель (типа long сo знаком), или позиция файла (без знака),в зависимости от значения dwMoveMethod.

lpDistanceToMoveHigh указывает на старшую часть значения перемещения. Если этот указатель равен NULL, функция может работать только с файлами, длина которых не превышает 232-2. Этот параметр используется также для возврата старшей части указателя файла. Младшая часть — это возвращаемое значение функции.

dwMoveMethod определяет один из следующих режимов перемещения:

• FILE_BEGIN — позиция нового указателя отсчитывается от начала файла, и
DistanceToMove интерпретируется как число без знака.

• FILE_CURRENT — указатель перемещается вперед или назад от текущей позиции
на расстояние, определяемое DistanceToMove, которое интерпретируется как
число со знаком. Положительное значение соответствует перемещению вперед.

• FILE_END — позиция отсчитывается назад или вперед от конца файла.

Эту функцию можно применять для определения длины файла, указывая нулевое перемещение с конца файла.

Метод представления 64-разрядных позиций вызывает трудности, поскольку функция может возвращать как позицию в файле, так и код ошибки. Например, предположим, что позиция в файле равна 232-1 (т.е. 0xFFFFFFFF) и что в вызове функции также указана старшая часть перемещения. Выяснить, что возвращает функ­ция — действительную позицию в файле или указание на ошибку, можно с помощью GetLastError, которая при отсутствии ошибки возвращает NO_ERROR. Это объясняет, почему длина файлов ограничивается значением 232 - 2 байт, когда старшая часть перемещения не указана.

Другая причина затруднений состоит в том, что старшая и младшая части перемещения разделены и обрабатываются по-разному. Младшая часть адреса передается по значению и возвращается как значение функции, а старшая передается по ссылке как в функцию, так и из нее.





Дата публикования: 2015-11-01; Прочитано: 404 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2025 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.784 с)...