Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2012, 11:36   #1
Aleks2215
Пользователь
 
Регистрация: 19.09.2010
Сообщений: 30
Вопрос Вопрос по ReadDirectoryChangesW

Вот есть у меня код вызова этой функции в асинхронном режиме:
Код:
DWORD numBytes;
	DWORD cbOffset;
	LPOVERLAPPED lpOverlapped;

 HANDLE hDir = CreateFileA("C:\\TEMP\\",
			  FILE_LIST_DIRECTORY,
			  FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE,
			  NULL,
			  OPEN_EXISTING,
			  FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED,
			  NULL);

 OVERLAPPED o;
 o.hEvent=CreateEventA(0, true, false, 0);

 BYTE outBuffer[5120];
 VOID *pBuf = (BYTE*)&outBuffer;
 FILE_NOTIFY_INFORMATION InfoNotify1;
 DWORD InfoNotify;
 BOOL ResultReadChange;
 DWORD outSize = sizeof(outBuffer);


 while(1)
 {
  ZeroMemory(outBuffer,sizeof(outBuffer));
 ResultReadChange = ReadDirectoryChangesW(hDir,
					 &outBuffer,
					 outSize,
					 TRUE,
					 FILE_NOTIFY_CHANGE_SIZE|
					 FILE_NOTIFY_CHANGE_DIR_NAME|
					 FILE_NOTIFY_CHANGE_FILE_NAME,
					 &InfoNotify,
					 &o,
					 NULL);

  if(WaitForSingleObject(o.hEvent,INFINITE)==WAIT_OBJECT_0)
  {
   PFILE_NOTIFY_INFORMATION fni = (PFILE_NOTIFY_INFORMATION)pBuf;
   AnsiString temp_patch = "C:\\TEMP";
			do
			{
				cbOffset = fni->NextEntryOffset;
				//wcstombs(path,fni->FileName,sizeof(fni->FileName));
				ZeroMemory(fni,sizeof(fni));
				if( fni->Action == FILE_ACTION_ADDED)
				Memo1->Lines->Add("Файл добавлен: "+temp_patch + "\\" + AnsiString(fni->FileName));
				else if( fni->Action == FILE_ACTION_REMOVED)
				Memo1->Lines->Add("Файл удален: "+temp_patch + "\\" + AnsiString(fni->FileName));
				else if( fni->Action == FILE_ACTION_MODIFIED)
				Memo1->Lines->Add("Файл изменен: "+temp_patch + "\\" + AnsiString(fni->FileName));
				else if( fni->Action == FILE_ACTION_RENAMED_OLD_NAME)
				Memo1->Lines->Add("Файл переименован. Старое имя: "+temp_patch + "\\" + AnsiString(fni->FileName));
				else if( fni->Action == FILE_ACTION_RENAMED_NEW_NAME)
				Memo1->Lines->Add("Файл переименован. Новое имя: "+temp_patch + "\\" + AnsiString(fni->FileName));

				fni = (PFILE_NOTIFY_INFORMATION)((LPBYTE) fni + cbOffset);

			} while( cbOffset );

  }
 }
Он корректно отслеживает изменения в папке и выводит мне сообщение. Но тут возник вопрос: Как узнать что изменения закончились? Т.е. к примеру удалили один файл из папки - программа это отлавливает и сообщает, что на этом изменения закончились и программа ждет следующего события (это естественно будет собственное сообщение).
Aleks2215 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ReadDirectoryChangesW() работает с UNC-путями? Либо с сетевыми дисками? malor Visual C++ 0 08.08.2011 13:58
ReadDirectoryChangesW + NetFileEnum/NetSessionEnum zdovim Общие вопросы C/C++ 6 08.12.2010 12:54
Вопрос по mySQL + Вопрос по RichEdit HTL Общие вопросы Delphi 4 01.01.2010 20:22
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10