Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора 97.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
778.75 Кб
Скачать

10.2 Управление каталогами

Создание или удаление каталога выполняется двумя простыми функциями.

BOOL CreateDirectory ( LPCTSTR lpszPath,

LPSECURITY___ATTRIBUTES lpsa) ;

BOOL RemoveDirectory (LPCTSTR lpszPath)

lpszPath указывает на строку с завершающим нулем, содержащую имя каталога, который должен быть создан или удален. Второй параметр (атрибуты безопасности) пока должен быть равен NULL. Удалить можно только пустой каталог.

Эта функция устанавливает каталог:

BOOL SetCurrentDirectory (LPCTSTR lpszCurDir)

lpszCurDir — путь к новому текущему каталогу. Это может быть относительный путь или полностью уточненный путь.

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

DWORD GetCurrentDirectory (DWORD cchCurDir, LPTSTR lpszCurDir)

Возвращаемое значение: длина строки возвращенного пути или требуемый размер буфера, если он недостаточно велик; нуль при неудаче.

Параметры

cchCurDir — длина в символах (не в байтах) буфера для имени каталога. Длина должна учитывать завершающий нулевой символ. lpszCurDir указывает на буфер, в который записывается строка пути.

Возможности файловых систем не ограничиваются последовательной обработкой; они также могут обеспечивать прямой доступ, блокировку файлов, работу с каталога­ми и управление атрибутами файлов.

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

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 байт, когда старшая часть перемещения не указана.

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

Атрибуты файлов и работа с каталогами

В каталоге можно искать файлы и другие каталоги, удовлетворяющие указанному образцу имени, а также получать атрибуты файлов. Для этого необходим дескриптор поиска, который возвращается функцией FindFirstFile. Для получения нужных файлов служит функция FindNextFile, а для завершения поиска — FindClose.

HANDLE FindFirstFile ( LPCSTSTR lpszSearchFile,

LPWIN32__FIND_DATA lpffd)

Возвращаемое значение: дескриптор поиска. INVALID_HANDLE_VALUE указывает на неудачу.

FindFirstFile ищет соответствие имени как среди файлов, так и среди подката­логов. Возвращаемый дескриптор используется в последующем поиске.

Параметры

lpszSearchFile указывает на каталог или полное имя, которое может содержать подстановочные знаки (? и *).

lpffd указывает на структуру WIN32_FIND_DATA, которая содержит информацию о найденном файле или каталоге.

Структура WIN32_FIND_DATA определена следующим образом:

typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes;

FILETIME ftCreationTime; FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime; DWORD nFileSizeHigh;

DWORD nFileSizeLow; DWORD dwReserved0;

DWORD dwReserved1; TCHAR cFileName [MAX_PATH];

TCHAR cAlternateFiiename [14];

} WIN32_FIND_DATA;

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

cFileName — это не полное имя, а собствен­но имя файла.

cAlternateFile — версия имени файла для DOS формата 8.3 (включая точку). Это то же сокращение имени файла, которое отображается в про­воднике Windows. Оба имени — строки с завершающим нулем.

Часто требуется найти в каталоге файлы, имена которых удовлетворяют образцу, содержащему подстановочные знаки ? и *. Для этого нужно получить из FindFirstFile дескриптор поиска, который содержит информацию об искомом имени, и вызвать функцию FindNextFile.

BOOL FindNextFile ( HANDLE hFindFile, LPWIN32_FIND_DATA lpffd)

Функция FindNextFile возвращает FALSE либо при недопустимых параметрах, либо если соответствие данному образцу уже нельзя найти. В последнем случае GetLastError возвращает ERROR_NO_MORE_FILES.

Когда поиск закончен, закройте дескриптор поиска. Не используйте для этого функ­цию CloseHandle. Для закрытия дескрипторов поиска предназначена функция:

BOOL FindClose (HANDLE hFindFile)

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]