Лабораторная работа № 7. Управление каталогами и файлами в ОС Windows

 

Цель: Изучение механизма управления каталогами в операционной системе 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); // какой поиск закончить




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: