DWORD GetLogicalDriveStrings(
DWORD nBufferLength, // size of buffer
LPTSTR lpBuffer// drive strings buffer
);
При успешном завершении функция возвращает количество символов скопированных в буфер.
DWORDGetLogicalDrives(VOID);
Двойное слово, которое возвращает эта функция, фактически является логической шкалой, нулевой бит в которой соответствует диску А, первый бит - В и так далее.
Для более подробной информации о дисках Windows предоставляет следующую функцию:
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName, // root directory
LPTSTR lpVolumeNameBuffer, // volume name buffer
DWORD nVolumeNameSize, // length of name buffer
LPDWORD lpVolumeSerialNumber, // volume serial number
LPDWORD lpMaximumComponentLength, // maximum file name length
LPDWORD lpFileSystemFlags, // file system options
LPTSTR lpFileSystemNameBuffer, // file system name buffer
DWORD nFileSystemNameSize)// length of file system name buffer
);
Для получения информации о разбивке тома, а также о свободном пространстве на диске предусмотрена функция
BOOL GetDiskFreeSpace(
LPCTSTR lpRootPathName, // root path
LPDWORD lpSectorsPerCluster, // sectors per cluster
LPDWORD lpBytesPerSector, // bytes per sector
LPDWORD lpNumberOfFreeClusters, // free clusters
LPDWORD lpTotalNumberOfClusters// total clusters);
Для получения полной информации о файле используется функция:
BOOL GetFileInformationByHandle( HANDLE hFile, // handle to file LPBY_HANDLE_FILE_INFORMATIONlpFileInformation// buffer);
Второй аргумент этой функции является указателем на структуру типа BY_HANDLE_FILE_INFORMATION, которая заполняется этой функцией. Структура описана в файле winbase.h. Это описание выглядит следующим образом:
Typedefstruct_BY_HANDLE_FILE_INFORMATION{
DWORD dwFileAttributes;
FILETIME ffCreationTime;
FILETIME ffLastAccessTime;
FILETIME ffLastWriteTime;
DWORD dwVolumeSerialNumber;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD nNumberOfLinks
DWORD nFileIndexHigh
DWORD nFileIndexLow
} BY_HANDLE_FILE_INFORMATION,
*PBY_HANDLE_FILE_INFORMATION,
*LBY_HANDLE_FILE_INFORMATION
Ниже приведено описание полей
§ Атрибуты файла;
§ Время создания файла;
§ Время последнего доступа к файлу;
§ Время последней записи в файл;
§ Серийный номер тома, на котором находится файл;
§ Старшие тридцать два разряда размера файла;
§ младшие тридцать два разряда размера файла;
§ число ссылок на файл
§ старшие тридцать два разряда идентификатора файла
§ младшие тридцать два разряда идентификатора файла
Для получения отдельной информации о файле служат следующие функции, по названию которых можно определить, какую информацию они возвращают:
DWORD GetFileAttributes( LPCTSTR lpFilname// name of file or directory);
DWORD GetFileSize( HANDLE hFile, // handle to file
LPDWORD lpFileSizeHigh// high-order word of file size );
BoolGetFileTime(
HANDLE hFile,
LPFILETIME lpCreationTime, // creation time
LPFILETIME lpLastAccessTime, // last access time
LPFILETIME lpLastWriteTime// last write time);
Запись информации в файл и чтение информации из файла.
Существует два режима чтения и записи файлов: синхронный и асинхронный. При синхронном вводе-выводе процесс выборки данных выглядит следующим образом:
1. Программист выделяет в памяти буфер определенного размера.
2. Программист открывает файл, к которому он намерен обращаться.
3. Программист устанавливает указатель файла на то место в файле, где находятся интересующие его данные.
4. Данные из файла считываются в буфер.
5. В буфере производятся определенные действия.
6. Буфер записывается на то же место в файле или добавляется в конец файла.
Естественно, что в реальной ситуации те или иные шаги могут быть опущены. Так, в данном курсовом проекте был пропущен пункт 6.
Прежде чем считывать информацию из файла или записывать информацию в файл , нам необходимо сначала его открыть. Для этого нам необходимо воспользоваться функцией CreateFile:
HANDLECreateFile( LPCTSTRlpFileName, // filename
DWORD dwDesiredAccess, // access mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurtityAttributes, // SD
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAttributes, // file attributes
HANDLE hTemplateFile// handle to template file);
Четвертый параметр lpSecurityAttributes, заслуживает особого разговора о нем. Он представляет собой указатель на структуру SECURITY_ATTRIBUTES, которая в файле winbase.h описана так:
typedefstruct_SECURITY_ATTRIBUTES{
DWORD nLendgth;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
}SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES,
*LPSECURITY_ATTRIBUTES;
Если никакой особой защиты файлу не требуется, то в это поле можно занести NULL.
Открыв файл нам в конце программы нужно обязательно закрыть его. Для того чтобы закрыть файл нам необходимо вызвать функцию CloseHandle:
BOOL CloseHandle(
HANDLE hObject// handle to object
);
Чтение данных из файла в синхронном режиме осуществляется с помощью функции ReadFile:
BOOL ReadFile(
HANDLE hFile, // handle to file
LPVOID lpBuffer, // data buffer
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // number of bytes read
LPOVERLAPPEDlpOverlapped// overlappedbuffer
);
Для того чтобы осуществить запись данных в файл предназначена функция:
BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped );
Перед тем как начать описание асинхронного режима чтения и записи файлов, необходимо обратить внимание на то, что асинхронный ввод-вывод в Windows’95/98 не работает, если, конечно, речь не идет о работе с последовательным портом.
Для того, чтобы осущсвить асинхронный доступ к файлу, мы должны открыть файл при помощи функции CreateFile и указать в аргументе dwflagsattributes флаг FILE_FLAG_OVERLAPPED, который укажет, что файл будет открыт именно для асинхронного доступа к данным.
Кроме этого, в данном случае, в отличие от операций, производимых в синхронном режиме, мы должны использовать структуру типа OVERLAPPED. В файле winbase.h эта структура описана следующим образом:
typedefstruct_OVERLAPPED{
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
}OVERLAPPED,*LPOVERLAPPED;
Специально для асинхронного ввода-вывода предназначены функции ReadFile и WriteFile. Я не буду подробно останавливаться на этих функциях, так как в данном курсовом проекте используется синхронный ввод данных.