Получение и изменение атрибутов файлов




 

В данном разделе мы рассмотрим основные функции Win32 API для получения и изменения атрибутов файлов. Для каждого файла поддерживается несколько атрибутов, универсальных для разных файловых систем. К ним относятся атрибуты архивный (archive), скрытый (hidden), системный (system), только для чтения (read–only), временный (temporary) и каталог (directory), а также дата и время создания, дата и время последнего изменения и дата и время последнего обращения к файлу.

Некоторые из этих атрибутов поддерживаются ограниченно. Так, например, атрибут временный (temporary) используется только для оптимизации доступа к файлу (система по возможности сохраняет все данные в оперативной памяти, не записывая их на диск), сам же файл при закрытии не удаляется.

Разные файловые системы, которые могут использоваться локальными или удаленными дисками, могут предоставлять даты и времена с разной точностью и в разном комплекте. Так, тома с обычной FAT под управлением MS–DOS хранят только дату и время последнего изменения файла с точностью до 2х секунд, тома с FAT, поддерживаемые системами типа Windows–95, Windows NT или OS/2 сохраняют дату и время создания и последнего изменения с точностью до 2х секунд и дату (без времени) последнего доступа к файлу. Как правило файловые утилиты показывают только время последнего изменения файла, так как эта информация, во–первых, предоставлена всеми используемыми файловыми системами, а во–вторых, потому что именно эта дата обычно интересует пользователя.

Для получения и изменения атрибутов предназначены две функции:

DWORD GetFileAttributes(lpFileName);

DWORD SetFileAttributes(lpFileName, dwFileAttributes);

Обе функции требуют имя файла, атрибуты которого возвращаются (изменяются), а также они упаковывают информацию об атрибутах в виде двойного слова, отдельные биты которого информируют о наличии тех или иных атрибутов. Вы можете использовать следующие символы, определяемые вместо конкретных значений атрибутов:

FILE_ATTRIBUTE_ARCHIVE

FILE_ATTRIBUTE_DIRECTORY

FILE_ATTRIBUTE_HIDDEN

FILE_ATTRIBUTE_NORMAL

FILE_ATTRIBUTE_READONLY

FILE_ATTRIBUTE_SYSTEM

FILE_ATTRIBUTE_TEMPORARY

Помимо двух рассмотренных функций, атрибуты файлов возвращаются еще некоторыми другими, как, например, уже рассмотренная нами функции FindFirstFile и FindNextFile, размещающие эту информацию в структуре WIN32_FIND_DATA, или функция GetFileInformationByHandle, возвращающая их в структуре BY_HANDLE_FILE_INFORMATION. Функция GetFileInformationByHandle не работает в системе Windows 3.x с Win32s.

BOOL GetFileInformationByHandle(hFile, lpFileInformation);

struct BY_HANDLE_FILE_INFORMATION {

DWORD dwFileAttributes;

FILETIME ftCreationTime;

FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime;

DWORD dwVolumeSerialNumber;

DWORD nFileSizeHigh;

DWORD nFileSizeLow;

DWORD nNumberOfLinks;

DWORD nFileIndexHigh;

DWORD nFileIndexLow;};

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

Во–первых, дата и время могут задаваться как всеобщее (UTC, coordinated universal time, время по Гринвичу) так и как локальное время. Разница сводится к учету часового пояса и перехода на летнее время. Подробнее — см. описание функций SetTimeZoneInformation и GetTimeZoneInformation.

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

При работе с файлами в Win32 API дата и время записаны как одно квадрослово (реально представлено в виде структуры из двух двойных слов) FILETIME.

struct FILETIME {

DWORD dwLowDateTime;

DWORD dwHighDateTime;};

Это квадрослово показывает число интервалов по 0.000 000 1 секунде (100 наносекунд), которые прошли, считая от 4 часов утра 1 января 1601 года. Такая, на первый взгляд странная, начальная дата объясняется просто: по правилам григорианского календаря високосными считаются года, номер которых нацело делится на 4, кроме тех, которые делятся нацело на 100, но включая те, номер которых нацело делится на 400. То есть год 1904 был високосным, 1908 тоже, а 1900 — нет. Однако 2000 год, равно как и 1600 год был таковым. Таким образом за начальную точку отсчета времени был взят первый день последнего 400–летнего цикла.

Для каждого файла определено 3 момента, информация о которых заносится в систему: дата и время создания файла, дата и время последнего изменения файла и дата и время последнего обращения к файлу.

Помимо уже рассмотренных функций FindFirstFile, FindNextFile и GetFileInformationByHandle, вы можете узнать или назначить для конкретного файла эти времена с помощью следующих функций:

BOOL GetFileTime(hFile, lpftCreation, lpftLastAccess, lpftLastWrite);

BOOL SetFileTime(hFile, lpftCreation, lpftLastAccess, lpftLastWrite);

Где hFile является хендлом открытого файла (см. функцию CreateFile), lpftCreation, lpftLastAccess и lpftLastWrite — указателями на три структуры типа FILETIME. Система использует информацию о дате и времени всегда в виде всеобщего времени.

При необходимости вы можете узнать, какое событие произошло раньше с помощью функции

LONG CompareFileTime(lpft1, lpft2);

А также вы можете преобразовать дату и время из всеобщего в локальное (с учетом часового пояса) и наоборот с помощью функций:

BOOL FileTimeToLocalFileTime(lpftUTC, lpftLocal);

BOOL LocalFileTimeToFileTime(lpftLocal, lpftUTC);

Обе эти функции используют структуры FILETIME для получения времени и возвращения результата.

Если вы переносите разработанную ранее программу под Win32 API, то может быть проще не переписывать все функции, анализирующие дату и время, а просто преобразовать полученные данные в формат MS–DOS. Для этого предназначены функции:

BOOL FileTimeToDosDateTime(lpft, lpwDOSDate, lpwDOSTime);

BOOL DosDateTimeToFileTime(wDOSDate, wDOSTime, lpft);

которые преобразуют дату и время из FILETIME в формат MS–DOS — два слова, в одном упаковывается дата, а в другом — время. Однако в иных случаях применять эти функции не рекомендуется. Проще преобразовать FILETIME в SYSTEMTIME, которая содержит всю необходимую информацию в отдельных полях структуры, что позволяет ее легко анализировать.

BOOL FileTimeToSystemTime(lpft, lpst);

BOOL SystemTimeToFileTime(lpst, lpft);

struct SYSTEMTIME {

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMillisecond;};

Параметры lpft и lpst являются указателями на структуры FILETIME и SYSTEMTIME соответственно; поля структуры SYSTEMTIME определяют год, месяц (январь считается 1), номер дня недели (0 — воскресенье), день месяца (начиная с 1), час, минуту, секунду и миллисекунду. Применение этих функций можно увидеть в примере 3B.

 

Работа с файлами

 

Как уже говорилось, в Win32 API есть все необходимое для работы с файлами. Приложение не нуждается в разработке дополнительного кода для выполнения типовых операций над файлами. Для удобства разработчиков в Win32 API определены специальные функции, осуществляющие копирование, перемещение, удаление и переименование файлов. Для выполнения этих операций предназначены 4 функции, декларированные в Win32 API:

BOOL CopyFile(lpszFileName, lpszNewFileName, fFailIfExists);

BOOL DeleteFile(lpszFileName);

BOOL MoveFile(lpszFileName, lpszNewFileName);

BOOL MoveFileEx(lpszFileName, lpszNewFileName, fdwFlags);

Функция CopyFile осуществляет копирование файла, заданного параметром lpszFileName в файл, заданный параметром lpszNewFileName. Дополнительный параметр функции fFailIfExist определяет реакцию системы в том случае, когда новый файл уже существует. Если fFailIfExist равно TRUE, то существующий файл сохраняется, а если этот параметр равен FALSE, то файл будет перезаписан.

Функция DeleteFile удаляет указанный файл.

Функции MoveFile и MoveFileEx осуществляют перемещение или копирование указанного файла. Однако области применения этих функций существенно различаются. Согласно описанию, функция MoveFile может переименовывать или перемещать файлы или каталоги, причем каталог перемещается целиком, со всеми входящими в него файлами и подкаталогами. Функция возвращает код ошибки в том случае, когда итоговый файл или каталог уже существует. Если перемещение осуществляется в пределах одного тома, то процесс перемещения сводится только к исправлению записей в каталогах, а реального перемещения данных не происходит. А если перемещение осуществляется на другой том, то функция MoveFile просто копирует файл и удаляет исходный, но при этом перемещение каталога на другой том не осуществляется — каталог можно перемещать только в пределах своего тома.

Функция MoveFileEx (не реализована в Windows–95 и в Win32s!) может переименовывать, перемещать или удалять только файлы, как в пределах одного тома, так и с тома на том. С помощью дополнительного параметра fdwFlags можно уточнить, каким образом будет осуществляться перемещение файла. Флаг MOVEFILE_REPLACE_EXISTING определяет, что файл будет перемещен или переименован, даже если итоговый файл уже существует. Если файл должен быть перемещен на другой диск, то аналогично функции MoveFile перемещение осуществляется как копирование и удаление исходного файла; если не указать флаг MOVEFILE_COPY_ALLOWED, то такое перемещение будет запрещено. Еще один флаг MOVEFILE_DELAY_UNTIL_REBOOT очень удобен при разработке инсталляционных программ. Этот флаг говорит системе, что файл надо перемещать не сейчас, при последующей загрузке системы. Таким образом появляется возможность замены файлов, являющихся компонентами системы или используемыми системой в процессе работы. Частный случай использования этой функции — задание параметра lpszNewFileName равным NULL совместно с флагом MOVEFILE_DELAY_UNTIL_REBOOT (согласно описанию допустимо только такое сочетание) — приводит к удалению указанного файла при перезагрузке системы.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-06-03 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: