Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > ReadDirectoryChangesW


Автор: nerig 29.4.2011, 08:33
Слежу за изменениями файлов в папке. Есть вот такой код:
Код

AnsiString dir = Form2->Edit1->Text;
HANDLE hdir = CreateFile(dir.c_str(),
              FILE_LIST_DIRECTORY,
              FILE_SHARE_READ|FILE_SHARE_WRITE,
              NULL,
              OPEN_EXISTING,
              FILE_FLAG_BACKUP_SEMANTICS/*|FILE_FLAG_OVERLAPPED*/,
              NULL);
FILE_NOTIFY_INFORMATION Buffer[1024];
DWORD BytesReturned;

while ( true)
{
int ret = ReadDirectoryChangesW(
        hdir,
        &Buffer,
        sizeof(Buffer),
        True,
        FILE_NOTIFY_CHANGE_SECURITY|
        FILE_NOTIFY_CHANGE_SIZE|
        FILE_NOTIFY_CHANGE_ATTRIBUTES|
        FILE_NOTIFY_CHANGE_DIR_NAME|
        FILE_NOTIFY_CHANGE_FILE_NAME,
        &BytesReturned,
        NULL,
        NULL
        );

 name = Buffer[0].FileName;
switch(Buffer[0].Action)
  {
   case FILE_ACTION_ADDED:
    Memo1->Lines->Add("Файл добавлен"+ name);
    break;
   case FILE_ACTION_REMOVED:
    Memo1->Lines->Add("Файл удален"+ name);
    break;
   case FILE_ACTION_MODIFIED:
    Memo1->Lines->Add("Файл изменен"+ name);
    break;
  }
  break;
}
 CloseHandle(hdir);
 delete [] Buffer;

Проблема в том, что работает он синхронно, в результате чего программа зависает и ждет изменений в папке, и только после них прога отвисает. Хотелось бы сделать ассинхронно, но что то не заладилось.  Либо как можно прервать выполнение данной процедуры через некоторое время по таймеру, если никаких действий не происходит. 
И еще один вопрос: иногда к имени файла дописывается лишние символы, как исправить?
Помогите, пожалуйста.

Автор: borisbn 29.4.2011, 09:51
Цитата(nerig @  29.4.2011,  08:33 Найти цитируемый пост)
Хотелось бы сделать ассинхронно

какая проблема ? переносишь весь код в поток (TThread) и всё. Только не забудь, что доступ к VCL-компонентам из потока можно осуществлять только через Synchronize.
Код

class MyThread : public TThread {
...
    AnsiString stringToAdd;
    void addString();
};

void MyThread::Execute() {
  while ( !Terminated ) {
      ReadDirectoryChangesW ...
      ...
      switch(Buffer[0].Action)
      {
           case FILE_ACTION_ADDED:
               //Memo1->Lines->Add("Файл добавлен"+ name);
               stringToAdd = "Файл добавлен"+ name;
               Synchronize( addString );
           break;
           ...
      }
  }
}

void MyThread::addString() {
    Form1->Memo1->Lines->Add( stringToAdd );
}



Автор: nerig 29.4.2011, 13:56
borisbn
при компиляции возникает ошибка "'MyThread::Execute()' is not the member of 'MyThread'"

Автор: borisbn 29.4.2011, 14:35
nerig, ээээээээ, так низя. я ж тебе просто показал, как это делается. ты смотрел документацию по TThread ?

Автор: nerig 29.4.2011, 14:41
borisbn
упс, дурак, думал что это уже код, извиняюсь, пошел смотреть документацию

Автор: nerig 29.4.2011, 17:31
так, вроде с потоками разобрался,
Код

class MyThread : public TThread
{
    AnsiString stringToAdd;
    void __fastcall addString();
public:
virtual  void __fastcall Execute(void);
};

void __fastcall MyThread::Execute() {
  while ( !Terminated ) {
  ...
  ReadDirectoryChangesW(
  ...      
  switch(Buffer[0].Action)
      {
           case FILE_ACTION_ADDED:
               stringToAdd = "Файл добавлен"+ name;
               Synchronize( addString );
           break;

      }
 }
}


void __fastcall MyThread::addString() {
    Form1->Memo1->Lines->Add( stringToAdd );
}

 а как сделать чтобы по кнопке они запускались не разберусь

Автор: borisbn 29.4.2011, 17:56
Под рукой нет документации, но в TThread есть что-то типа Start
Не забудь, что в конмтрукторе формы нужно создать (new) объект типа MyThread, а в деструкторе остановить поток (thread->Terminate(); thread->WaitFor();) и удалить объект (delete)

Автор: nerig 30.4.2011, 05:01
Разобрался со всем, только почему то в memo не пишется имя добавленного файла, а только что файл добавлен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)