Оконное приложение, основанное на mfc. В главном окне имеется два editbox-а, в один вводится папка входных данных, в другой - папка выходных данных. По нажатию на кнопку "Старт" начинается слежение за изменениями во входной папке. Как только что-то происходит (нопример, в папку попадает файл), программа просматривает всё содержимое папки (включая то, что было в ней до изменений) и переносит все найденные файлы в выходную папку. Затрагиваемые темы: работа с файловой системой, события, wait-функции, создание потоков, работа с интерфейсом.
MoveFile Эта функция переносит в заданную директорию файл или папку (включая все её подпапки). Может также использоваться для переименования файла/папки. Возвращаемое значение - успех/неудача. BOOL MoveFile( Более подробную информацию можно получить в MSDN. Как используется в данной программе: void ProcessFile (LPTSTR fname) //Обработчик файла CreateEvent Эта функция создаёт или открывает существующее событие, возвращаемым значением является его описатель. HANDLE CreateEvent( Рассмотрим подробнее некоторые параметры функции: typedef struct _SECURITY_ATTRIBUTES { bManualReset - если этот параметр true, то помещение объекта в несигнальное состояние нужно производить вручную (путём вызова спецмальной функции). Если же передать сюда false, то событие будет обладать автосбросом, т.е. автоматически возвращаться в несигнальное состояние. Более подробную информацию можно получить в MSDN. Как используется в данной программе: BOOL CSynhronizeDlg::OnInitDialog() WaitForMultipleObjects Эта функция приостанавливает выполнение текущего потока до тех пор, пока один или все указанные в её параметрах объекты ядра не придут в сигнальное состояние (также возможен выход по таймауту). Применяется для ограниничения доступа к разделяемым ресурсам. Параметром чаще всего служат события, семафоры или мьютексы, уведомления (notification), процессы, потоки и некоторые другие объекты. Возвращаемое значение показывает, что послужило выходом из функции. Это может быть значение от WAIT_OBJECT_0 до (WAIT_OBJECT_0 + nCount– 1) - номер объекта ядра, пришедшего в сигнальное состояние (в случае, если мы ожидаем любого из них), от WAIT_ABANDONED_0 to (WAIT_ABANDONED_0 + nCount– 1) - специфическое значение в случае использования мьютексов (номер мьютекса, его вызвавшего) или WAIT_TIMEOUT - выход по таймауту. DWORD WaitForMultipleObjects( Рассмотрим подробнее некоторые параметры функции: Более подробную информацию можно получить в MSDN. Как используется в данной программе: см. пример к FindFirstChangeNotification. FindFirstChangeNotification Функция FindFirstChangeNotification создаёт описатель объекта ядра "уведомление", с помощью которого можно отслеживать заданные фильтром изменения в директории или её поддереве. При выполнении заданного условия (например, появления новых файлов, переименования файлов, изменение их размеров или аттрибутов и т.п.) объект приходит в сигнальное состояние, что можно отследить какой-нибудь wait-функцией. После первого изменения можно продолжить ожидание (т.е. по сути вернуть "уведомление" в несигнальное состояние и направить к ожиданию изменений) с помощью функции FindNextChangeNotification. После завершения слежения необходимо вызывать функцию FindCloseChangeNotification, чтобы освободить объект ядра "уведомление". HANDLE FindFirstChangeNotification( BOOL FindNextChangeNotification( BOOL FindCloseChangeNotification( Рассмотрим подробнее некоторые параметры функции FindFirstChangeNotification: Более подробную информацию можно получить в MSDN (FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification). Как используется в данной программе: HANDLE hNotification= FindFirstChangeNotification(g_strInFolder, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME); //Начинаем отслеживать изменения в заданной папке посредством специальной функции FindFirstFile Функция FindFirstFile создаёт описатель "поиск" (возвращаемое значение) и начинает поиск файлов и папок в заданной директории, соответствующих определённой маске. Продолжать поиск следует через функцию FindNextFile, которая работает с уже существующим описателем и возвращает bool-значение, показывающее, найдено ли ещё что-то в директории. После окончания поиска его следует закрыть функцией FindClose. HANDLE FindFirstFile( BOOL FindNextFile( BOOL FindClose( Рассмотрим подробнее некоторые параметры функций: typedef struct _WIN32_FIND_DATA { Это возвращаемое значение, из этой структуры мы можем получить всю необходимую информацию о найденном файле или папке. К тому же, по первому полю этой структуры (dwFileAttributes) мы можем узнать, к примеру, файл или папку мы нашли. Более подробную информацию можно получить в MSDN (FindFirstFile, FindNextFile, FindClose). Как используется в данной программе: HANDLE hFindFile= FindFirstFile (g_strInFolder+"\\*.*", &fd); //Начинаем просматривать папку WaitForSingleObject Эта функция приостанавливает выполнение текущего потока до тех пор, пока указанный в её параметрах объект ядра не придёт в сигнальное состояние (также возможен выход по таймауту). Применяется для ограниничения доступа к разделяемым ресурсам. Параметром чаще всего служит событие, семафор или мьютекс, но также в качестве параметра может выступать уведомление (notification), процесс, поток и некоторые другие объекты. Возвращаемое значение показывает, что послужило выходом из функции. Это может быть WAIT_ABANDONED (специфическое значение, возвращаемое в случае завершения потока, владеющего мьютексом), WAIT_OBJECT_0 (объект получил сигнальное состояние - в этом случае функция сама переводит его в несигнальное, а для семафора наращивает счётчик числа занятых ресурсов), WAIT_TIMEOUT (функция вышла по таймауту). DWORD WaitForSingleObject( dwMilliseconds - здесь можно указать любой необходимый таймаут, кроме того, если указать 0, функция вернёт потоку управление сразу (таким образом можно проверить состояние объекта), а если указать константу INFINITE, функция не будет учитывать время и будет ждать только сигнального состояния объекта ядра. Более подробную информацию можно получить в MSDN. Как используется в данной программе: WaitForSingleObject(m_hThread, INFINITE); //Ждём, пока поток завершит работу CreateThread Эта функция создаёт поток внутри адресного пространства текущего процесса. Возвращает описатель созданного потока. Функция полезна, когда, например, нужно выполнять какие-то действия в оконном приложении, но не отключать при этом его интерфейс. В общем случае поток начинает работу сразу после вызова этой функции, и все действия, которые он выполняет, не мешают работе программы. HANDLE CreateThread( Рассмотрим подробнее некоторые параметры функции: DWORD WINAPI ThreadProc( //Имя функции может быть произвольным lpParameter - параметр, передаваемый в стартовую функцию потока. Если потоку необходимо передать несколько параметров, следует либо использовать глобальные переменные, либо объявлять структуру со всеми необходимыми данными и передавать её. Более подробную информацию можно получить в MSDN. Как используется в данной программе: m_hThread= CreateThread(NULL, 0, WorkThread, NULL, 0, &dwID); //Создаём поток |
Обратная связь: Посетите мой проект: |