Цель: Изучение механизма управления каталогами в операционной системе Windows.
Задачи:
1. Изучение теоретического материала по управлению каталогами.
2. Составление алгоритма программы.
3. Программная реализация.
Ход работы:
1. Ознакомиться с описанием функций WinAPI по управлению каталогами и файлами и примерами их использования.
2. Получить индивидуальный вариант задания у преподавателя, в котором должны быть указаны операции для манипулирования с файлами и/или каталогами.
3. Разработать программу в соответствии с полученным заданием.
4. Написать отчет и представить его для защиты лабораторной работы вместе с исполняемыми модулями программы и их исходными текстами.
Ход защиты:
1. Продемонстрировать преподавателю разработанную программу.
2. Пояснить код разработанной программы.
Большинство современных ОС поддерживает логическую модель
данных, основанную на неких абстрактных единицах, называемых файлами, которые могут группироваться по разным признакам в так называемые
каталоги. В ОС Windows NT /2000/ XP есть несколько функций, которые могут оперировать с каталогами и файлами. Созданием файла занимается функция
|
|
HANDLE CreateFile (
LPCTSTR FileName, // имя файла
DWORD Access, // тип доступа к файла
DWORD Sharing, // тип разделения файла
LPSECURITY_ATTRIBUTES Attrib, // указатель на описатель защиты
DWORD CreationDistr,
// что делать, когда файл существует
DWORD Flags, // флаги и атрибуты файла
HANDLE Template);
// дескриптор файла, чьи атрибуты могут быть скопированы
Для получения информации о конкретном файле используется функция
BOOL GetFileInformationByHandle (
HANDLE File, // дескриптор файла
LPBY_HANDLE_FILE_INFORMATION);
// описатель структуры с информацией о файле
За чтение из файла и запись в файл отвечают следующие две функции.
BOOL ReadFile (
HANDLE File, // дескриптор файла
LPVOID Buf, // адрес буфера, в котором хранятся данные из файла
DWORD BytesToRead, // сколько байтов прочитать
LPDWORD BytesRead, // сколько байтов прочитано
LPOVERLAPPED Overlap); // перекрываемый ввод-вывод
BOOL WriteFile (
HANDLE File, // дескриптор файла
LPVOID Buf,
// адрес буфера, в котором хранятся данные для записи
DWORD BytesToWrite, // сколько байтов записать
LPDWORD BytesWriten, // сколько байтов прочитано
LPOVERLAPPED Overlap); // перекрываемый ввод-вывод
Следующий фрагмент кода демонстрирует копирование файла File. txt в файл Output. txt.
HANDLE In, Out;
In = CreateFile (“File.txt”, GENERIC_READ, 0, NULL,
OPEN_EXISTING, 0, NULL);
Out = CreateFile (“Output.txt”, GENERIC_WRITE, 0, NULL,
CREATE_ALLWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
BOOL Finished;
do {
Finished = ReadFile (In, Buffer, BufferSize, &NumOfRead,
NULL);
if (Finished && NumOfRead > 0)
WriteFile (Out, Buffer, NumOfRead, &NumOfWriten, NULL);
} while (Finished > 0 && NumOfRead > 0);
CloseHandle (In);
|
|
CloseHandle (Out);
Аналогичные действия обеспечиваются функцией
BOOL CopyFile(
LPCTSTR ExistingFileName, // Имя файла-источника
LPCTSTR NewFileName, // Имя файла-получателя
BOOL bFailIfExists); // Действия, если файл уже существует
Пример использования.
CopyFile(“c:\\oldfile.exe”, “c:\\newfile.exe”, FALSE);
Аналогично выглядит переименование файла, а также его удаление.
BOOL MoveFile(
LPCTSTR ExistingFileName, // Имя файла-источника
LPCTSTR NewFileName); // Имя файла-получателя
BOOL DeleteFile(
LPCTSTR ExistingFileName); // Имя файла-источника
Пример использования.
MoveFile(“c:\\tmp\\oldfile.txt”, “c:\\newfile.txt”);
DeleteFile (“c:\\tmp\\oldfile.txt”);
Для выполнения еще одной полезной файловой операции, а именно перемещения внутри файла принято использовать функцию
DWORD SetFilePointer(
HANDLE File, // Дескриптор открытого файла
LONG BytesToMove, // Количество байтов, на которые надо перейти
PLONG DistanceToMoveHigh,
// Количество байтов, на которое произошел переход
DWORD dwMoveMethod); //С какой позиции двигаться
Пример использования этой функции.
SetFilePointer (File, BytesToRead, 0,FILE_BEGIN);
Новый каталог создается, а пустой уничтожается функциями
BOOL CreateDirectory (
LPCTSTR PathName, // имя каталога
LPSECURITY_ATTRIBUTES lpSecurityAttributes);
// атрибуты безопасности
BOOL RemoveDirectory (
LPCTSTR lpPathName); // имя каталога
Пример использования одной из них.
if (RemoveDirectory("c:\\new")) printf ("каталог удален\n");
Следующие две функции дают возможность получить информацию о текущем каталоге и изменить текущий каталог. Ниже расположен пример их использования.
DWORD GetCurrentDirectory (
DWORD BufferLength, // размер буфера с именем каталога
LPTSTR Buffer); // указатель на буфер с именем каталога
BOOL SetCurrentDirectory (
LPCTSTR PathName); // имя каталога
GetCurrentDirectory (sizeof (buffer), buffer);
printf (“%s\n”, buffer);
SetCurrentDirectory ("D:\\");
GetCurrentDirectory (sizeof (buffer), buffer);
printf (“%s\n”, buffer);
Для поиска файлов используются две функции. Первая функция начинает поиск:
HANDLE FindFirstFile (
LPCTSTR FileName, // какой файл ищется, можно указывать маску
LPWIN32_FIND_DATA FindData);
// указатель на структуру с информацией
Для продолжения поиска используется функция:
BOOL FindNextFile (
HANDLE FindFile, // что искать
LPWIN32_FIND_DATA FindData); // структура с информацией
Пример их использования
WIN32_FIND_DATA FindData;
HANDLE MyFile;
MyFile = FindFirstFile ("d:\\*.*", &FindData);
if (MyFile!= INVALID_HANDLE_VALUE) {
do {
printf (“%s\n”, FindData.cFileName;
} while (FindNextFile (MyFile, &FindData));
FindClose (MyFile);
}
Функция FindClose завершает поиск файла. Она описана так.
BOOL FindClose (
HANDLE FindFile); // какой поиск закончить