на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Файловая система
p align="left">Несколько других функций предназначены для поиска файла или для получения списка файлов в каталоге. Функция SearchPath ищет определенный файл и возвращает полный путь к файлу, если только этот файл найден.

DWORD SearchPath(lpszPath, lpszFile, lpszExt, cchBuffer, lpszBuffer, plpszFileNamePart);

Параметр lpszPath указывает на каталог, в котором надо искать файл. Если этот параметр равен NULL, то Windows будет искать файл в том каталоге, откуда приложение запущено, в текущем каталоге, в системных каталогах Windows, и в самом каталоге Windows, а также во всех каталогах, перечисленных на пути поиска, заданном параметром окружения PATH. Параметр lpszFile задает имя файла для поиска, lpszExt -- расширение имени искомого файла (используется, если указанное имя не содержит расширения). Параметры cchBuffer, lpszBuffer задают характеристики (размер и адрес) буфера, принимающего имя файла, а указатель на указатель plpszFileNamePart определит позицию, начиная с которой в буфере находится имя файла (то есть первый символ после последнего `\' в пути).

Три функции FindFirstFile, FindNextFile и FindClose примерно соответствуют функциям _dos_findfirst, _dos_findnext и _dos_findclose библиотеки времени выполнения. Функция FindFirstFile требует задания шаблона имен файлов и указателя на специальную структуру WIN32_FIND_DATA, которая будет заполняться информацией о текущем файле, соответствующем шаблону. Функция создает специальный объект, используемый в последующих вызовах функции FindNextFile для продолжения перебора файлов в каталоге. После завершения перебора созданный объект необходимо удалить с помощью функции FindClose.

HANDLE FindFirstFile(lpszFileName, lpFindFileData);

BOOL FindNextFile(hFindFile, lpFindFileData);

BOOL FindClose(hFindFile);

struct WIN32_FIND_DATA {

DWORD dwFileAttributes;

FILETIME ftCreationTime;

FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime;

DWORD dwSizeHigh;

DWORD dwSizeLow;

DWORD dwReserved0;

DWORD dwReserved1;

TCHAR cFileName[ MAX_PATH ];

TCHAR cAlternateFileName[ 14 ];};

Пример:

WIN32_FIND_DATA fd;

HANDLE hFD;

hFD = FindFirstFile(“c:\\*.*”, &fd);

if (hFD) {

do {

// анализ структуры fd и выполнение необходимых действий над файлами.

} while (FindNextFile(hFD, &fd));

FindClose(hFD);}

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

HANDLE FindFirstChangeNotification(lpszPath, fWatchSubTree, fdwFilter);

HANDLE FindNextChangeNotification(hChange);

BOOL FindCloseChangeNotifictaion(hChange); Аналогичная группа функций существует и для получения информации о принтерах (FindFirstPrinterChangeNotification, FindNextPrinterChangeNotification и FindClosePrinterChangeNotification), только она реализована исключительно для Windows NT. Согласно описанию для Windows-95 или Windows 3.x с Win32s эти функции не доступны.

Функции FindFirstChangeNotification и FindNextChangeNotification возвращают управление сразу после установки созданного объекта в занятое состояние. Вы можете использовать функции WaitForSingleObject или WaitForMultipleObjects для ожидания изменений в каталоге.

Функция FindCloseChangeNotifictaion удаляет созданный объект.

Внимание! Эти функции не реализованы для Windows 3.x с Win32s. Однако, помимо этого ограничения, существует еще несколько особенностей в применении этих функций. Так, при работе в Windows-95 переименование одного файла в каталоге может приводить к двукратному сообщению об изменении содержимого каталога. Еще серьезнее ограничение на использование удаленных каталогов (каталогов других компьютеров, предоставленных в общий доступ) -- система вообще не отслеживает изменения в них, даже если эти изменения осуществлены с вашего компьютера. Это справедливо и для Windows-95 и для Windows NT.

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

В данном разделе мы рассмотрим основные функции 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, то файл будет перезаписан.

Страницы: 1, 2, 3, 4, 5, 6, 7



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.