- •Введение
- •Тема 1. Двухпросмотровый ассемблер
- •Тема 2. Com-сервер для обработки и хранения результатов тестирования.
- •Тема 3. Дисковая утилита для просмотра fat.
- •Тема 4. Сервер автоматизации ole.
- •Тема 5. Дефрагментатор файловой системы.
- •Элемент каталога для короткого имени
- •Тема 6. Монитор системных ресурсов для Windows 98/2000.
- •Тема 7. Менеджер процессов и потоков для Windows 98/2000.
- •Тема 8. Файловый менеджер для Windows 98/2000/nt.
- •Тема 9. Формат исполняемого pe-файле в Windows 98/nt.
- •Тема 10. Запуск в определенное время различных программ.
- •Тема 11. Утилита, сохраняющая в файле информацию из системного реестра о программах, установленных на компьтере.
- •Тема 12. Утилита для очистки системного реестра Windows.
- •Тема 13. Утилита, отслеживающая изменения в файловой системе Windows в заданных каталогах.
- •Тема 14. Просмотрщик таблицы разделов и fat.
- •Тема 15. Утилита MaxSplitter
- •Тема 16. Утилита удаленного администрирования.
- •Тема 17. Простая почтовая программа на основе протокола smtp.
- •Тема 18. Ftp - клиент.
- •Тема 19. Ftp - сервер.
- •Тема 20. Системные сервисы Windows nt/2000.
- •Литература
- •Приложение 1. Tcp/ip Программирование с использованием WinSock
- •Создание и использование сокетов
- •Закрытие сокета
- •Функция shutdown()
- •Методы прекращения работы гнезда
- •Функция bind()
- •Приложение может послать запрос на соединение с помощью функции
- •Отправка и прием данных через сокеты потоков
- •Ожидание и обработка событий
- •Использование функции wsaAsyncSelect()
- •Приложение 2. Команды ftp
- •Приложение 3. Команды smtp
- •Приложение 4. Заголовки почты smtp
Тема 8. Файловый менеджер для Windows 98/2000/nt.
Техническое задание.
Разработать программу для управления файлами и каталогами, аналогичную Проводнику Windows. Предусмотреть выдачу информации о дисках, поиск файлов и другие возможности.
Методические указания.
Для выяснения того, какие логические диски существуют в системе, используется функция
DWORD GetLogicalDrives( VOID);
Каждый установленный бит возвращаемого значения соответствует существующему в системе логическому устройству. Например, если в системе существуют диски A:, C: и D:, то возвращаемое функцией значение равно 13 (1101). Функция
DWORD GetLogicalDriveStrings( DWORD nBufferLength, LPTSTR lpszBuffer);
заполняет lpszBuffer информацией о корневом каталоге каждого логического диска в системе. В приведенном выше примере буфер будет заполнен символами
A:\<null>C:\<null>D:\<null><null>
параметр nBufferLength определяет длину буфера. Функция возвращает реальную длину буфера, необходимую для размещения всей информации. Если необходимая длина буфера заранее неизвестна, то можно воспользоваться следующим классическим приемом:
DWORD dw = GetLogicalDrivesStrings( 0, NULL ) ;
LPSTR lpDriveStrings = HeapAlloc( GetProcessHeap(), 0, dw*sizeof(TCHAR));
GetLogicalDrivesStrings( dw, lpDriveStrings );
Для определения типа диска предназначена функция
UINT GetDriveType( LPTSTR lpszRootPathName );
В качестве параметра ей передается символическое имя корневого каталога (напр. A:\\), а возвращаемое значение может быть одно из следующих:
Идентификатор |
Значение |
Описание |
DRIVE_UNKNOWN |
0 |
Тип устройства определить нельзя |
DRIVE_NO_ROOT_DIR |
1 |
Корневой каталог не существует |
DRIVE_REMOVABLE |
2 |
Гибкий диск |
DRIVE_FIXED |
3 |
Жесткий диск |
DRIVE_REMOTE |
4 |
Сетевой диск |
DRIVE_CDROM |
5 |
Дисковод для компакт-дисков |
DRIVE_RAMDISK |
6 |
RAM диск (эмулируемый в оперативной памяти) |
Для получения подробной информации о носителе используется функция GetVolumeInformation. Она заполняет параметры информацией об имени тома, названии файловой структуры, максимальной длине имени файла, дополнительных атрибутах тома, специфических для файловой структуры.
Функция GetDiskFreeSpace сообщает информацию о размерах сектора и кластера и о наличии свободных кластеров.
Функция DeviceIoControl позволяет прикладной программе обращаться напрямую к драйверу устройства и выполнять большое количество действий, среди которых: форматирование дорожек или раздела, выталкивание носителя из привода, разбивка диска на разделы и многие другие.
Для работы с каталогами и файлами предназначены следующие функции:
Функция |
Выполняемое действие |
GetCurrentDirectory |
Получение текущего каталога |
SetCurrentDirectory |
Смена текущего каталога |
GetSystemDirectory |
Получение системного каталога |
GetWindowsDirectory |
Получение основного каталога системы |
CreateDirectory |
Создание каталога |
RemoveDirectory |
Удаление каталога |
CopyFile |
Копирование файла |
MoveFile MoveFileEx |
Перемещение или переименование файла |
DeleteFile |
Удаление файла |
Для того, чтобы создать или открыть файл используется функция
HANDLE CreateFile(
LPCTSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security descriptor
DWORD dwCreationDistribution, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
);
Параметр lpFileName определяет имя файла.
Параметр dwDesiredAccess задает тип доступа к файлу. Можно определить флаги GENERIC_READ и GENERIC_WRITE а так же их комбинацию для разрешения чтения или записи в файл.
Параметр dwShareMode определяет режим совместного использования файла различными процессами. Если этот параметр равен нулю, то никакой другой поток не сможет открыть этот же файл. Флаги FILE_SHARE_READ и FILE_SHARE_WRITE а так же их комбинация разрешают другим потокам осуществлять доступ к файлу для чтения или записи.
Параметр lpSecurityAttributes указывает на структуру, описывающую защиту создаваемого объекта ядра. Ему может быть присвоено значение NULL.
Параметр dwCreationDistribution определяет действия функции в зависимости от того, существует ли уже файл с указанным именем.
Идентификатор |
Файл уже существует |
Файл еще не существует |
CREATE_NEW |
Ошибка |
Создает файл |
CREATE_ALWAYS |
Уничтожает существующий файл и создает новый |
Создает файл |
OPEN_EXISTING |
Открывает файл |
Ошибка |
OPEN_ALWAYS |
Открывает файл |
Создает файл |
TRUNCATE_EXISTING |
Открывает файл и урезает его до нулевой длины |
Ошибка |
Параметр dwFlagsAndAttributes определяет атрибуты файла, если он создается и задает режим работы с файлом.
Константа |
Атрибут файла |
FILE_ATTRIBUTE_ARCHIVE |
Архивный |
FILE_ATTRIBUTE_HIDDEN |
Скрытый |
FILE_ATTRIBUTE_NORMAL |
Нет никаких атрибутов |
FILE_ATTRIBUTE_READONLY |
Только для чтения |
FILE_ATTRIBUTE_SYSTEM |
Системный |
FILE_ATTRIBUTE_TEMPORARY |
Временный (хранимый в памяти, но не удаляемый при закрытии) |
Атрибуты файла могут комбинироваться за исключением FILE_ATTRIBUTE_NORMAL, который всегда используется в одиночестве.
Вместе с атрибутами могут комбинироваться и флаги, задающие режим работы с файлом.
Флаг |
Режим работы с файлом |
FILE_FLAG_NO_BUFFERING |
Не осуществлять кэширование и опережающее чтение |
FILE_FLAG_RANDOM_ACCESS |
Кэшировать как файл произвольного доступа |
FILE_FLAG_SEQUENTIAL_SCAN |
Кэшировать как файл последовательного доступа |
FILE_FLAG_WRITE_TROUGH |
Не буферизовать операцию записи. Производить запись на диск немедленно. |
FILE_FLAG_DELETE_ON_CLOSE |
Уничтожить файл при закрытии. Полезно комбинировать с атрибутом FILE_ATTRIBUTE_TEMPORARY. |
FILE_FLAG_OVERLAPPED |
Работа с файлом будет осуществляться асинхронно. |
Параметр hTemplateFile либо равен NULL, либо задает описатель открытого файла. Во втором случае параметр dwFlagsAndAttributes игнорируется, а указанный файл используется в качестве шаблона, т.е. используются его флаги и атрибуты.
В случае удачи функция CreateFile возвращает описатель открытого файла как объекта ядра. Существенно, что в противном случае она возвращает не NULL, а INVALID_HANDLE_VALUE.
Для работы с файлами используются следующие функции
Функция |
Выполняемое действие |
ReadFile |
Чтение. |
WriteFile |
Запись |
SetFilePointer |
Позиционирование указателя |
SetEndOfFile |
Изменение размера файла |
FlushFileBuffers |
Принудительная запись буферов кэширования на диск |
LockFile LockFileEx |
Блокировка части файла от записи другими потоками. |
UnlockFile UnlockFileEx |
Разблокировка ранее заблокированной части файла |
Перемещать, переименовывать, копировать или удалять папки вместе с файлами можно с помощью функции SHFileOperation.