Задания по операционным системам и пара примеров.

1. Потоки

С помощью функции CreateThread создать нить и выполнить в ней ряд действий. В программе должны быть предусмотрена возможность приостановить, возобновить и прекратить выпоняемые действия. Нить должна передавать главному процессу свой статус, к примеру, текущие действия или процент выполнения (статус можно передавать, например, изменением приватных полей формы и использовать значения этих полей используется для отображения по таймеру). Выход из нити осуществлять с помощью функции ExitThread. При решении задачи желательно использование WinAPI-функций.

Задачи:

1. Произвести поиск заданого файла на заданом диске (по заданному пути) по имени.

2. Произвести поиск подстроки в тексте (открытом файле) с возможностью поиска как только целых слов, так и их произвольных частей.

3. Произвести подсчет занимаемого файлового пространства указанного каталога, включая подкаталоги, предоставляя возможность задать маску требуемых файлов в стандартном виде (abc*.mp?).

4. Выполнить сравнение двух указанных файлов и вывести результаты построчно с возможностью выбора вида отображения (только различия, только общее, смешанный). Результаты сравнения сохранить в заданый файл.

5. Выполнить установку атрибутов файлов, включая подкаталоги, предоставляя возможность задать маску требуемых файлов в стандартном виде (abc*.mp?).

6. Произвести сканирование списка процессов с выводом загруженных модулей и доступной информации о них. (Process32First, Process32Next, CreateToolhelp32Snapshot)

7. Произвести сканирование списка нитей с выводом родительских процессов. Результат отобразить в виде дерева. (Thread32First, Thread32Next, CreateToolhelp32Snapshot)

8. Произвести сканирование сети: домен, компьютеры. Результат отобразить в виде дерева. (WNetEnumResource)

9. Произвести шифрование\дешифрование каталога по какому-либо обратимому алгоритму с возможностью установки пароля.

10. Игра Пинг-Понг: две ракетки, каждая управляемая своим потоком, отбивают мяч.

11. Вычисление числа Пи (алгоритм на http://ru.wikipedia.org/wiki/Метод_Монте-Карло) путем эмуляции бросания иглы на поверхность. Поток должен "бросать иглы", главный процесс - следить за прогрессом и выдавать текущие значения.

12. Поиск простых чисел. Поток ищет простые числа (начиная с заданного), главный процесс следит за прогрессом и выдает текущие значения.

13. Вычисление суммы слагаемых бесконечного ряда. Варианты рядов:
1) 1+1/2+1/3+1/4+...
2) 1-1/2+1/3-1/4+1/5-...
3) 2!+4!+6!+...
4) 1+(1+2)+(1+2+3)+...+(1+2++...+n).
Один ряд - один поток. Желательна возможность одновременного запуска нескольких потоков и возможность на лету регулировать приоритет каждого потока.

14. Игра Жизнь (описание на http://ru.wikipedia.org/wiki/Жизнь_(игра) ). Поток рассчитывает циклы жизни, главный процесс отображает сопутствующую информацию.

15. Алгоритм поиска пути (любой, примеры на http://pmg.org.ru/ai/stout.htm). Сгенерировать большой лабиринт (не менее 50х50 клеток) и рассчитать потоком путь из центра наружу.

16. Задача о рюкзаке. Есть N вещей, каждая вещь имеет вес и стоимость. Есть рюкзак, вместимостью W kg. Необходимо найти такую комбинацию вещей, чтобы их суммарный вес не превосходил W и стоимость была максимальной. Каждая вещь дана в единственном экземпляре (т.е. надо решить, брать/не брать). Поток рассчитывает содержимое рюкзака для большого N, главный процесс отображает текущую наполненность и стоимость.

17. Создать большое число нитей (не менее 5) с различными приоритетами выполнения и столько же компонентов TProgressBar, которые отображали бы процесс выполнения нитей.
-------------------------------------------
2. Синхронизация потоков

В программе должен быть некий общий ресурс (файл, переменная, область памяти...), доступ к которому необходимо синхронизировать для различных потоков (с помощью событий, мьютексов, семафоров, критических секций и т.п.). При решении задачи желательно использование WinAPI-функций.

1. В первом потоке происходит поиск по маске файлов в определенном каталоге. Найденные файлы передаются для обработки во второй поток, который считает занимаемое ими место на диске и выводит на экран статистику. Реализация предпочтительна с использованием событий.

2. Первый поток производит поиск подстроки в тексте (открытом файле) с возможностью поиска как только целых слов, так и их произвольных частей. Второй поток занимается подсчетом количества найденных подстрок и выводом статистики на экран. Реализация предпочтительна с использованием событий.

3. Произвести подсчет занимаемого файлового пространства с использованием нескольких потоков. Каждый поток должен добавлять записи в общий файл протоколирования, в который нужно записывать номер потока, имена и размеры файлов. Реализация предпочтительна с использованием критических секций.

4. Выполнить сравнение двух указанных файлов следующим образом: для каждого файла создается свой поток, открывающий и читающий файл в память. После готовности обоих потоков производится сравнение двух файлов построчно в третьем потоке и выводе результатов на экран. Реализация предпочтительна с использованием событий.

5. Выполнить установку атрибутов файлов, включая подкаталоги, предоставляя возможность задать маску требуемых файлов в стандартном виде (abc*.mp?). Первый поток ищет файлы и предоставляет их второму, ожидая, пока второй поток не выставит нужные атрибуты. Реализация предпочтительна с использованием событий.

6. Задаются две маски файлов. Первая маска - это маска директорий, вторая - это маска файлов. Также задается начальный каталог работы. После запуска происходит работа двумя нитями. Первая нить производит поиск с начального каталога работы директорий, удовлетворяющих первой маске. Если она находит такие директории, то их имена она передает второй нити, которая ищет в них файлы, удовлетворяющие второй маске.

7. Произвести потоком сканирование сети: домен, компьютеры (используя WNetEnumResource). Результат вторым потоком отобразить в виде дерева. Данные сканирования сети должны передаваться через глобальные переменные с использованием событий и критических секций. При отображении данных вторым потоком на TTree должен использоваться метод Synchronize.

8. Игра Пинг-Понг: две ракетки, каждая управляемая своим потоком, отбивают мяч. На экран также выводится статистика голов. Реализация предпочтительна с использованием событий.

9. Два потока изменяют различные параметры объекта, отображаемого графически (например, строят на экране башню из геометрических фигур). Каждый поток можно приостановить. Реализация предпочтительна с использованием критических секций.

10. Проблема обедающих философов: пять философов сидят за круглым столов и у каждого есть тарелка со спагетти. Между каждыми двумя тарелками лежит одна вилка. Для еды каждому философу нужно две вилки. Жизнь философа состоит из чередующихся периодов поглощения пищи и размышлений. Если филосов голоден, он пытается заполучить обе вилки, и левую, и правую, в любом порядке. Если ему это удается, он некоторое время есть, а потом кладет вилки обратно и продолжает размышения. Написать программу, графически моделирующую действия философов (каждый философ - поток).

11. На перекрестках со знаком STOP по всем четырем направлениям существует правило: каждый водитель уступает дорогу машине справа. Смоделировать движение на таком перекрестке (каждый подъезжающий автомобиль - отдельных поток). Предусмотреть разрешение ситуации, когда к перекрестку одновременно подъезжают четыре автомобиля со всем сторон.

12. Проблема спящего брадобрея: в парикмахерской есть один брадоббрадобрей, его кресло и п стульев для посетителей. Если желающих воспользоваться его услугами нет, брадобрей сидит в своем кресле и спит. Если в парикмахерскую приходит клиент, он должен разбудить брадобрея. Если клиент приходит и видит, что брадобрей занят, он либо садится на стул (если есть место), либо уходит (если места нет). Написать программу, графически моделирующую такую парикмахерскую (каждый клиент и брадобрей - отдельные потоки).

13. Студент, специализирующийся на антропологии и изучавший в качестве неосновной дисциплины вычислительную технику, начал исследовательский проект, чтобы увидеть, могут ли африканские бабуины обучаться ситуации со взаимоблокировками. Он определяет место глубокого каньона и прикрепляет канат через него, так что бабуины могут переправиться через пропасть на руках. Несколько бабуинов могут переправляться одновременно при условии, что они все будут двигаться в одном направлении. Если бабуины, перемещающиеся в западном и восточном направлении, одновременно залезут на канат, в результате получится взаимоблокировка (бабуины застрянут на середине), потому что один бабуин не может перелезть через другого, пока они оба висят над каньоном. Если бабуин хочет пересечь каньон, он должен проверить, что в данный момент нет других бабуинов, пересекающих каньон в противоположном направлении. Напишите программу, моделирующую данную ситуацию семафорами и избегающую взаимоблокировок.

14. Имеется банк, содержащий данные о вкладчиках и значение их счетов. Общая сумма денег в банке складывается как сумма счетов всех вкладчиков. Вкладчики могут добалять деньги на свой счет или снимать деньги со счета. За каждую транзакцию банк взимает 1% от перечисляемой суммы. Каждый вкладчик - это отдельная нить. Сделать так, чтобы количество вкладчиков можно было задавать в начале программы и после запуска можно было наблюдать изменения на счетах вкладчиков и общую сумму денег. Вкладчиков и банк реализовать в виде классов. Обращение к банку (к своему счету) происходит через критические секции.

15. Некий университет решил продемонстрировать свою политкорректность, применив известную доктрину верховного суда США «Равенство порознь равенством не является» не только к цвету кожи, но и к полу. Результатом этого решения явились совместные ванные комнаты в общежитиях. Тем не менее в поддержку исторически сложившейся традиции университет попостановляет, что если в ванной комнате есть женщина, то другая женщина может туда зайти, а мужчина не может, и наоборот. На двери ванной есть индикатор, показывающий, в каком из трех состояний находится ванная: а) никого нет; б) в ванной женщины; в) в ванной мужчины.
Написать программу, моделирующую данную задачу. Предпочтительно использование семафоров.
-------------------------------------
3. Маппинг файлов

При решении задачи обязательно использование WinAPI-функций файлового ввода-вывода и отображения файлов в память. Как минимум один из файлов, описанных в задаче, должен быть отображен в память и доступ к нему осущесвляется на уровне указателей. Желательно работать с проецируемыми файлами в режиме записи. Также требуется проверка возвращаемых результатов системных функций и обработка всех исключений.

CreateFile
CloseHandle
ReadFile
WriteFile
CreateFileMapping
MapViewOfFile и т.п.

1. Открыть существующий, указанный пользователем, файл и записать блок данных в указанную им позицию.
2. Считать из одного структурированного файла блок данных с заданной позиции и записать его в другой файл.
3. Посимвольным считыванием файла определить, является он символьным или бинарным, вывести статистику (наиболее часто используемые символы).
4. Скопировать из одного текстового файла в другой все слова, содержащие заданные пользователем символы. Словами считать последовательности латинских и русских букв, остальные символы считать разделителями.
5. Переписать содержимое файла в обратном порядке (не используя рекурсию).
6. Объединить несколько указанных файлов в один, вывести его размер.
7. Сравнить два файла по смысловому содержанию, т.е. расстояния между словами и разделители не имеют значения, а слова считаются одинаковыми, если состоят из одних и тех же букв (регистр не имеет значения).
8. Из текстового файла удалить слова, которых нет в другом файле-словаре.
9. Прочитать текстовый файл. Вывести информацию о количестве слов, состоящих из одного, двух и т.д. символов.
10. Имеется текстовый файл упорядоченных по дате сообщений. Каждая строка состоит из даты и самого сообщения. Вывести все сообщения за указанный период в отдельный файл.
11. Из заданного структурного файла, в котором хранится информация о товарах (наименование, цена, количество), вывести в другой текстовый файл наименования тех товаров, количество которых не меньше указанного пользователем числа.
12. Известен размер блока данных структурированного файла. Удалить блоки, содержащие нули.
----------------------------------------------------
==========================================
Темы для вопросов

1. Операционные системы, структура (81-89)
2. Процессы и потоки (модели, различия) (стр. 97-123)
3. Механизмы синхронизации (126-150)
4. Взаимоблокировка (тупики, их избежание, алгоритм банкира...) (184-216)
5. Виды памяти, иерархия, различные модели (47-52, 217-231)
6. Виртуальная память (232-245, 266-276)
7. Ввод-вывод (контроллеры, DMA, прерывания...) (304-337)
8. Файловые системы (444-477)
9. FAT, NTFS (http://www.ixbt.com/storage/ntfs.html)

=====================================
4. Клиент-серверное приложение

Требуется разработать клиент-серверное приложение (то есть и клиент, и сервер), позволяющие работать по сети. Работу с сетью необходимо реализовать на нижнем уровне (создание сокета, прослушивание порта и т.п.) БЕЗ использования компонентов Delphi. Сервер должен позволять задать номер порта, по которому он будет расположен; клиенты должны позволять задать номер порта и IP-адрес сервера (в случае запуска на одной машине - localhost или 127.0.0.1). Сервер может быть консольным приложением (без графического интерфейса).

Справочные материалы лежат в папке "Операционные системы\Задачи\Клиент-сервер\".

1. Текстовый калькулятор. Клиент содержит поле для ввода примера в текстовом виде (например, 4+(3*0.74-sin(0.1))), по кнопке эта строка отправляется на сервер. Сервер вычисляет результат и возвращает его клиенту, либо возвращает сообщение об ошибке (непарные скобки и т.п.).

2. Чат. Сервер хранит структуру диалога чата (набор записей типа "дата-время, текст сообщения, имя автора, IP автора"). Клиенты подключаются к серверу и выводят последние 20 сообщений, обновляя каждые 5 секунд. Клиент может отправить на сервер сообщение, тогда сервер добавит сообщение в диалог и клиенты при последующем обновлении увидят это новое сообщение.

3. Служба времени. Клиент задает текстовую строку с запросом времени или даты (например, "дата через день", "дата через 2 недели", "время сейчас", "время через час") и по кнопке отправляет на сервер. Сервер анализирует запрос, рассчитывает время и возвращает клиенту в формате "ГГ.ММ.ДД ЧЧ:ММ:СС".

4. Крестики-нолики. Сервер хранит информацию о доске, последовательности ходов игроков и т.п. Клиент в графическом виде рисует доску по информации с сервера, и позволяет отправить ход игрока на сервер. Реализованная задача должна позволять двум игрокам от начала до конца сыграть в сеанс игры в крестики-нолики.

5. Онлайн-словарь. Клиент отправляет слово (текстовую строку), сервер ищет ее у себя в базе. Если найдено точное соответствие - возвращает словарную статью (описание слова), если нет - предлагает список похожих вариантов или сообщает об отсутствии слова и похожих на него.
========================================================
4. Планирование процессов

Таненбаум, "Современные операционные системы"
страницы 157-172 (пакетная обработка, интерактивные системы), 520-525 (системы реального времени).

Варианты задач:

1. Предложить свой вариант алгоритма планирования (в бумажном виде, с описанием и блок-схемой алгоритма, и обоснованием, какие преемущества дает новый алгоритм)
2. Смоделировать работу одного из алгоритмов планирования (желательно графически)

Пакетная обработка:
*1. FIFO
2. Кратчайшая - первая + наименьшее оставшееся время выполнения
4. Трехуровневое планирование

Интерактивные системы:
*1. Циклическое планирование
2. Приоритетное планирование - несколько очередей
3. Самый короткий - следующий
4. Гарантированное планирование
5. Лотерейное планирование
6. Справедливое планирование

Системы реального времени:
1. RMS - статический
2. EDF - динамический
===============================================================

Используя Функции WinAPI выполнить задачи.

FinFirstFile
FindNextFile
FindClose

GetFileSize
GetFileAttributes
SetFileAttributes
GetFileTime
SetFileTime
FileTimeToSystemTime
SystemTiem ToFileTime
GetFileInformationByHandle
CopyFile
DeleteFile
MoveFile

GetLogicalDrives
GetLogicalDriveSettings
CreateDirectory
RemoveDirectory
SetCurrentDirectory
GetCurrentDirectory
GetTempPath
GetWindowsPath
GetSystemPath

GetDiskFreeSpaceEx
GetVolumeinformation
ShellExecute

1. Вывести список файлов в заданном каталоге в порядке убывания размера файлов.
2. Вывести список всех скрытых файлов заданного каталога.
3. Вывести список файлов в заданными атрибутами (скрытые, системные, архивные, только для чтения)
4. Для всех файлов заданного каталога добавить атрибут
"скрытый", если файл только для чтения;
и сбросить атрибут "архивный" в обратном случае.
5. Вывести имя файла из заданного каталога с самой ранней датой создания
6. Всем файламиз заданного каталога, всем файлам, которые были созданы более
недели назад установить текущую дату.
7. Из заданной папки скопировать файлы с определенными атрибутами в другую папку.
8. В заданной папке удалить файлы, созданные ранее определенной даты,
остальные переименовать, добавив к имени текущую дату
9. Вывести список логических дисков, их общий объем и объем свободного пространства.
Определить, доступен ли диск по записи.
10.Вывести имена и размер всех файлов из заданного каталога.
11.Вывести из заданного каталога имена всех подкаталогов, не содержащих
в себе файлы.
12.Вывести полный путь к временной папке (GetTempPath) и удалить из нее
все файлы с заданным разрешением.
13.Рекурсивно удалить все пустые подкаталоги заданного каталога.
14.По маске рекурсивно удалить все файлы из подкаталогов заданного каталога.
15.Написать программу, подсчитывающую размер, выбранного каталога на диске.
Вывести информацию о количестве папок, файлов и их атрибуты.
16.Написать навигатор по файловой системес возможностью открытия,
просмотра и изменения имени и атрибутов файла(каталога)
17.Написать программу поиска файлов по маске, дате создания,
последнему времени доступа, размеру, атрибутам.

--------------------------------------------------------------------------------------
Задача №2
С помощью функции CreateThread создать нить и выполнить в ней следующие действия.
В программе должны быть предусмотрена возможность приостановить,
возобновить и прекратить выпоняемые действия. Нить должна передавать главному процессу
свой статус, т.е. что она сейчас делает и каков процент выполнения.
Статус передается изменением определенных приватных полей у визуальной формы. Значение
этих полей используется для отображения их по таймеру.
Выход из нити осуществлять с помощью функции ExitThread.

Действия:
1. Произвести поиск заданого файла на заданом диске по имени.
2. Произвести поиск подстроки в тексте(файле).
3. Произвести подсчет занимаемого файлового пространства указанного каталога,
включая подкаталоги.
4. Выполнить сравнение двух указанных файлов. Результаты сравнения
сохранить в заданый файл.
5. Выполнить установку атрибутов файлов, включая подкаталоги.
6. Произвести сканирование списка процессов с выводом загруженных модулей.
(Process32First, Process32Next, CreateToolhelp32Snapshot)
7. Произвести сканирование списка нитей с выводом родительских процессов.
(Thread32First, Thread32Next, CreateToolhelp32Snapshot)
8. Произвести сканирование сети:домен, компьютеры.
(WNetEnumResource)
9. Шифрование каталога, т.е. всех файлов в этом каталоге и подкататалогов.
10. Форматирование текстовых файлов(*.txt) в определенном каталоге.
Форматирование заключается в следующем:
1. Все строки текста устанавливаются определенной длины. Если в строке символов больше,
то они переносятся на следующую строку.
2. Если перед редактируемой строкой имеется пустая строка, то текущая строка считается
началом абзаца и начинается с отступа.
11.

Задача №2.1a
На форме в числовое поле вводится число от 2 до 10. Создать введенное количество
нитей с различными приоритетами выполнения и столько же компонентов TProgressBar,
которые отображали бы процесс выполнения нитей.
======================================
Задачи на нити и синхронизацию потоков:

1. В первом потоке происходит поиск по маске файлов в определенном каталоге.
Найденные файлы передаются для обработки во второй поток, который считает
место файлов на диске.
Использовать события(CreateEvent).

2. Первый поток ищет текстовые строки в файле. Второй поток занимается подсчетом
количества этих строк.
Использовать события(CreateEvent).

3. Два потока изменяют различные параметры объекта, отображаемого графически.
Использовать критические секции(TCriticalSection).

4. Два потока играют в пинг-понг. Игру надо отобразить графически.
Использовать события(CreateEvent).

5. Создать два приложения(клиент и сервер), которые используют один и тот же именнованный
канал(CreateNamedPipe). Эти приложения должны уметь записывать и считывать из него
данные. Чтение данных должно производиться асинхронно.
Примечание: смотреть раздел Windows SDK под названием "Pipe Functions".
Пример серверного приложения: "Server Using Completion Routines.txt"
Пример клиентского приложения: "Named Pipe Client Process.txt"

6. Модернизировать задачу 4.3 (произвести подсчет занимаемого файлового пространства) так,
чтобы в ней возможно было создавать несколько рабочих нитей. Каждая нитка должна вести
свой файл протоколирования, в который писать время и имена использованных файлов.
При подсчете размера файла использать одну на всех критическую секцию.
Нити должны быть созданы с использованием класса TThread.

7. Создать два приложения, которые используют одно и тоже именнованое событие(CreateEvent).
После этого первое приложение должно писать какие-либо данные, введенные на форме,
в заранее известный файл и устанавливать событие. Второе приложение при взведении
события должно прочитывать данные из файла, выводить на форму и сбрасывать событие.

8. Модернизировать задачу 4.8 (произвести сканирование сети) так, чтобы данные
сканирования сети передавались между главной ниткой приложения и вспомогательной
через глобальные переменные с использованием событий(TSimpleEvent) и
критических секций(TCriticalSection).

9. Имеется банк. Он содержит данные о вкладчиках и значение их счетов. Общая сумма денег
в банке складывается как сумма счетов всех вкладчиков. Вкладчики могут добалять деньги
на свой счет или снимать деньги со счета. Вкладчики могут брать деньги в кредит, но не более
1% от всей суммы банка. Каждый вкладчик - это отдельная нить. Сделать так, чтобы
количество вкладчиков можно было задавать в начале программы. Обращение к банку(к своему
счету) происходит через критические секции.

10. Задаются две маски файлов. Первая маска - это маска директорий, вторая - это маска файлов.
Также задается начальный каталог работы.
После запуска происходит работа двумя нитями. Первая нить производит поиск с начального
каталога работы директорий, удовлетворяющих первой маске. Если она находит такие директории,
то их имена она передает второй нити, которая ищет в них файлы, удовлетрворяющие второй
маске.

Пример использования критических секций и событий:

  var
     CS : TCriticalSection;
     ScanEnd : TSimpleEvent;
     Data : TData;
   begin
     //Где-то создается критическая секция...
     Log('Пытаюсь войти в критическую секцию...')
     CS.Enter;
     try
       //Здесь происходит обращение к данным
       Use(Data);
       Sleep(1000)
       //Взводим событие, которое говорит о завершении сканирования
       ScanEnd.SetEvent; 
     finally
       CS.Leave;
       Log('Вышла из критической секции...')
     end;
   end;

=================================================================

#include <windows.h>  
 
typedef struct 
{ 
   OVERLAPPED oOverlap; 
   HANDLE hPipeInst; 
   CHAR chBuf[BUFSIZE]; 
   DWORD cbToWrite; 
} PIPEINST, *LPPIPEINST; 
 
BOOL CreateAndConnectInstance(); 
BOOL ConnectToNewClient(HANDLE, LPOVERLAPPED); 
VOID GetDataToWriteToClient(LPPIPEINST); 
VOID DisconnectAndClose(LPPIPEINST); 
VOID WINAPI CompletedWriteRoutine(DWORD, DWORD, LPOVERLAPPED); 
VOID WINAPI CompletedReadRoutine(DWORD, DWORD, LPOVERLAPPED); 
 
HANDLE hPipe; 

 
DWORD main(VOID) 
{ 
   HANDLE hConnectEvent; 
   OVERLAPPED oConnect; 
   LPPIPEINST lpPipeInst; 
   DWORD dwWait, cbBytes; 
   BOOL fSuccess, fPendingIO; 
 
// Create one event object for the connect operation. 
 
   hConnectEvent = CreateEvent( 
      NULL,    // no security attribute
      TRUE,    // manual reset event 
      TRUE,    // initial state = signaled 
      NULL);   // unnamed event object 
  if (hConnectEvent == NULL) 
      MyErrExit("CreateEvent"); 

 
   oConnect.hEvent = hConnectEvent; 
 
// Call a subroutine to create one instance, and wait for 
// the client to connect. 
 
   fPendingIO = CreateAndConnectInstance(&oConnect); 
 
   while (1) 
   { 
   // Wait for a client to connect, or for a read or write 
   // operation to be completed, which causes a completion 
   // routine to be queued for execution. 
 
      dwWait = WaitForSingleObjectEx( 
         hConnectEvent,  // event object to wait for 

         INFINITE,       // waits indefinitely 
         TRUE);          // alertable wait enabled 
 
      switch (dwWait) 
      { 
      // The wait is satisfied by a completed connect operation. 
         case 0: 
         // If an operation is pending, get the result of the 
         // connect operation. 
 
         if (fPendingIO) 
         { 
            fSuccess = GetOverlappedResult( 
               hPipe,     // pipe handle 
               &oConnect, // OVERLAPPED structure 

               &cbBytes,  // bytes transferred 
               FALSE);    // does not wait 
            if (!fSuccess) 
               MyErrExit("ConnectNamedPipe"); 
         } 
 
         // Allocate storage for this instance. 
 
            lpPipeInst = (LPPIPEINST) GlobalAlloc( 
               GPTR, sizeof(PIPEINST)); 
            if (lpPipeInst == NULL) 
               MyErrExit("GlobalAlloc lpPipeInst"); 
 
            lpPipeInst->hPipeInst = hPipe; 
 

         // Start the read operation for this client. 
         // Note that this same routine is later used as a 
         // completion routine after a write operation. 
 
            lpPipeInst->cbToWrite = 0; 
            CompletedWriteRoutine(0, 0, (LPOVERLAPPED) lpPipeInst); 
 
         // Create new pipe instance for the next client. 
 
            fPendingIO = CreateAndConnectInstance( 
               &oConnect); 
            break; 
 
      // The wait is satisfied by a completed read or write 

      // operation. This allows the system to execute the 
      // completion routine. 
 
         case WAIT_IO_COMPLETION: 
            break; 
 
      // An error occurred in the wait function. 
 
         default: 
            MyErrExit("WaitForSingleObjectEx"); 
      } 
   } 
   return 0; 
} 
 
// CompletedWriteRoutine(DWORD, DWORD, LPOVERLAPPED) 
// This routine is called as a completion routine after writing to 
// the pipe, or when a new client has connected to a pipe instance. It 

// starts another read operation. 
 
VOID WINAPI CompletedWriteRoutine(DWORD dwErr, DWORD cbWritten, 
   LPOVERLAPPED lpOverLap) 
{ 
   LPPIPEINST lpPipeInst; 
   BOOL fRead = FALSE; 
 
// lpOverlap points to storage for this instance. 
 
   lpPipeInst = (LPPIPEINST) lpOverLap; 
 
// The write operation has finished, so read the next request (if 
// there is no error). 
 
   if ((dwErr == 0) && (cbWritten == lpPipeInst->cbToWrite)) 
      fRead = ReadFileEx( 

         lpPipeInst->hPipeInst, 
         lpPipeInst->chBuf, 
         BUFSIZE, 
         (LPOVERLAPPED) lpPipeInst, 
         (LPOVERLAPPED_COMPLETION_ROUTINE) CompletedReadRoutine); 
 
// Disconnect if an error occurred. 
 
   if (! fRead) 
      DisconnectAndClose(lpPipeInst); 
} 
 
// CompletedReadRoutine(DWORD, DWORD, LPOVERLAPPED) 
// This routine is called as an I/O completion routine after reading a 
// request from the client. It gets data and writes it to the pipe. 

 
VOID WINAPI CompletedReadRoutine(DWORD dwErr, DWORD cbBytesRead, 
    LPOVERLAPPED lpOverLap) 
{ 
   LPPIPEINST lpPipeInst; 
   BOOL fWrite = FALSE; 
 
// lpOverlap points to storage for this instance. 
 
   lpPipeInst = (LPPIPEINST) lpOverLap; 
 
// The read operation has finished, so write a response (if no 
// error occurred). 
 
   if ((dwErr == 0) && (cbBytesRead != 0)) 
   { 
      GetDataToWriteToClient(lpPipeInst); 
 
      fWrite = WriteFileEx( 

         lpPipeInst->hPipeInst, 
         lpPipeInst->chBuf, 
         lpPipeInst->cbToWrite, 
         (LPOVERLAPPED) lpPipeInst, 
         (LPOVERLAPPED_COMPLETION_ROUTINE) CompletedWriteRoutine); 
   } 
 
// Disconnect if an error occurred. 
 
   if (! fWrite) 
      DisconnectAndClose(lpPipeInst); 
} 
 
// DisconnectAndClose(LPPIPEINST) 
// This routine is called when an error occurs or the client closes 
// its handle to the pipe. 
 
VOID DisconnectAndClose(LPPIPEINST lpPipeInst) 

{ 
// Disconnect the pipe instance. 
 
   if (! DisconnectNamedPipe(lpPipeInst->hPipeInst) ) 
      MyErrExit("DisconnectNamedPipe"); 
 
// Close the handle to the pipe instance. 
 
   CloseHandle(lpPipeInst->hPipeInst); 
 
// Release the storage for the pipe instance. 
 
   if (lpPipeInst != NULL) 
      GlobalFree(lpPipeInst); 
} 
 
// CreateAndConnectInstance(LPOVERLAPPED) 
// This function creates a pipe instance and connects to the client. 
// It returns TRUE if the connect operation is pending and FALSE if 

// the connection has been completed. 
 
BOOL CreateAndConnectInstance(LPOVERLAPPED lpoOverlap) 
{ 
   LPTSTR lpszPipename = "\\\\.\\pipe\\mynamedpipe"; 
 
   hPipe = CreateNamedPipe( 
      lpszPipename,             // pipe name 
      PIPE_ACCESS_DUPLEX |      // read/write access 
      FILE_FLAG_OVERLAPPED,     // overlapped mode 
      PIPE_TYPE_MESSAGE |       // message-type pipe 
      PIPE_READMODE_MESSAGE |   // message read mode 
      PIPE_WAIT,                // blocking mode 

      PIPE_UNLIMITED_INSTANCES, // unlimited instances 
      BUFSIZE,                  // output buffer size 
      BUFSIZE,                  // input buffer size 
      PIPE_TIMEOUT,             // client time-out 
      NULL);                    // no security attributes
  if (hPipe == INVALID_HANDLE_VALUE) 
      MyErrExit("CreatePipe"); 
 
// Call a subroutine to connect to the new client. 
 
   return ConnectToNewClient(hPipe, lpoOverlap); 
}

----------------------------

#include <windows.h>  
 
DWORD main(int argc, char *argv[]) 
{ 
   HANDLE hPipe; 
   LPVOID lpvMessage; 
   CHAR chBuf[512]; 
   BOOL fSuccess; 
   DWORD cbRead, cbWritten, dwMode; 
   LPTSTR lpszPipename = "\\\\.\\pipe\\mynamedpipe"; 
 
// Try to open a named pipe; wait for it, if necessary. 
 
   while (1) 
   { 
      hPipe = CreateFile( 
         lpszPipename,   // pipe name 
         GENERIC_READ |  // read and write access 
         GENERIC_WRITE, 

         0,              // no sharing 
         NULL,           // no security attributes
         OPEN_EXISTING,  // opens existing pipe 
         0,              // default attributes 
         NULL);          // no template file 
 
   // Break if the pipe handle is valid. 
 
      if (hPipe != INVALID_HANDLE_VALUE) 
         break; 
 
      // Exit if an error other than ERROR_PIPE_BUSY occurs. 
 
      if (GetLastError() != ERROR_PIPE_BUSY) 
         MyErrExit("Could not open pipe"); 

 
      // All pipe instances are busy, so wait for 20 seconds. 
 
      if (! WaitNamedPipe(lpszPipename, 20000) ) 
         MyErrExit("Could not open pipe"); 
   } 
 
// The pipe connected; change to message-read mode. 
 
   dwMode = PIPE_READMODE_MESSAGE; 
   fSuccess = SetNamedPipeHandleState( 
      hPipe,    // pipe handle 
      &dwMode,  // new pipe mode 
      NULL,     // don't set max. bytes 
      NULL);    // don't set max. time 
   if (!fSuccess) 

      MyErrExit("SetNamedPipeHandleState"); 
 
// Send a message to the pipe server. 
 
   lpvMessage = (argc > 1) ? argv[1] : "default message"; 
 
   fSuccess = WriteFile( 
      hPipe,                  // pipe handle 
      lpvMessage,             // message 
      strlen(lpvMessage) + 1, // message length 
      &cbWritten,             // bytes written 
      NULL);                  // not overlapped 
   if (! fSuccess) 
      MyErrExit("WriteFile"); 
 

   do 
   { 
   // Read from the pipe. 
 
      fSuccess = ReadFile( 
         hPipe,    // pipe handle 
         chBuf,    // buffer to receive reply 
         512,      // size of buffer 
         &cbRead,  // number of bytes read 
         NULL);    // not overlapped 
 
      if (! fSuccess && GetLastError() != ERROR_MORE_DATA) 
         break; 
 
      // Reply from the pipe is written to STDOUT. 
 
      if (! WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), 

         chBuf, cbRead, &cbWritten, NULL)) 
         break; 
 
   } while (! fSuccess);  // repeat loop if ERROR_MORE_DATA 
 
   CloseHandle(hPipe); 
 
   return 0; 
} 

===================================================================
Используя Функции WinAPI выполнить задачи.

FinFirstFile
FindNextFile
FindClose

GetFileSize
GetFileAttributes
SetFileAttributes
GetFileTime
SetFileTime
FileTimeToSystemTime
SystemTiem ToFileTime
GetFileInformationByHandle
CopyFile
DeleteFile
MoveFile

GetLogicalDrives
GetLogicalDriveSettings
CreateDirectory
RemoveDirectory
SetCurrentDirectory
GetCurrentDirectory
GetTempPath
GetWindowsPath
GetSystemPath

GetDiskFreeSpaceEx
GetVolumeinformation
ShellExecute

1. Вывести список файлов в заданном каталоге в порядке убывания размера файлов.
2. Вывести список всех скрытых файлов заданного каталога.
3. Вывести список файлов в заданными атрибутами (скрытые, системные, архивные, только для чтения)
4. Для всех файлов заданного каталога добавить атрибут
"скрытый", если файл только для чтения;
и сбросить атрибут "архивный" в обратном случае.
5. Вывести имя файла из заданного каталога с самой ранней датой создания
6. Всем файламиз заданного каталога, всем файлам, которые были созданы более
недели назад установить текущую дату.
7. Из заданной папки скопировать файлы с определенными атрибутами в другую папку.
8. В заданной папке удалить файлы, созданные ранее определенной даты,
остальные переименовать, добавив к имени текущую дату
9. Вывести список логических дисков, их общий объем и объем свободного пространства.
Определить, доступен ли диск по записи.
10.Вывести имена и размер всех файлов из заданного каталога.
11.Вывести из заданного каталога имена всех подкаталогов, не содержащих
в себе файлы.
12.Вывести полный путь к временной папке (GetTempPath) и удалить из нее
все файлы с заданным разрешением.
13.Рекурсивно удалить все пустые подкаталоги заданного каталога.
14.По маске рекурсивно удалить все файлы из подкаталогов заданного каталога.
15.Написать программу, подсчитывающую размер, выбранного каталога на диске.
Вывести информацию о количестве папок, файлов и их атрибуты.
16.Написать навигатор по файловой системес возможностью открытия,
просмотра и изменения имени и атрибутов файла(каталога)
17.Написать программу поиска файлов по маске, дате создания,
последнему времени доступа, размеру, атрибутам.