Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отслеживание изменений ФС


petvv ©   (2009-03-16 11:35:00) 

Отслеживаю изменение ФС в определённой директории и при появлении нового файла преобразовываю его в dbf. Вот код:

procedure TForm1.FormCreate(Sender: TObject);

Type PFileNotifyInformation=^TFileNotifyInformation;
   TFileNotifyInformation=packed record
     NextEntryOffset:dword;
     Action:dword;
     FileNameLength:dword;
     FileName:WideChar;
   end;
var hDir,cbReturn:dword;
   lpBuf:pointer;
   Ptr:PFileNotifyInformation;

begin
 ShownOnce := False;
 CreateTrayIcon(1);
 HideItem.Enabled := False;

Path:='D:\Накладные';
hDir:=CreateFile(Path,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE
 or FILE_SHARE_DELETE,nil,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0);
if hDir=INVALID_HANDLE_VALUE then begin ShowMessage(SysErrorMessage(GetLastError));exit;end;
GetMem(lpBuf,BUF_SIZE);
repeat
 ZeroMemory(lpBuf,BUF_SIZE);
 if(not ReadDirectoryChangesW(hDir,lpBuf,BUF_SIZE,true,FILE_NOTIFY_CHANGE_FILE_NAME
 or FILE_NOTIFY_CHANGE_LAST_WRITE,@cbReturn,nil,nil))or(cbReturn=0)then Break;
 // пользователь не сможет прервать ожидание, если захочет. Это нужно либо вынести в отдельный
 // поток, либо использовать синхронный ввод/вывод
 Ptr:=lpBuf;OldName:='';
 repeat
 GetMem(FileName,Ptr^.FileNameLength+2);
 ZeroMemory(FileName,Ptr^.FileNameLength+2);
 lstrcpynW(FileName,addr(Ptr^.FileName),Ptr.FileNameLength div 2+1);
// case Ptr.Action of // здесь нужно разместить реальные процедуры обработки данных
//   FILE_ACTION_ADDED:ShowMessage('File '+FileName+' was created.');

//   FILE_ACTION_REMOVED:ShowMessage('File '+FileName+' was removed.');
//   FILE_ACTION_MODIFIED:ShowMessage('File '+FileName+' was modified.');
//   FILE_ACTION_RENAMED_OLD_NAME:OldName:=FileName;
//   FILE_ACTION_RENAMED_NEW_NAME:ShowMessage('File '+OldName+' renamed to '+FileName+'.');
// end;

 if Ptr.Action=1 then TxtToDBF;
 FreeMem(FileName);
 if Ptr^.NextEntryOffset=0 then break;
 Inc(integer(Ptr),Ptr^.NextEntryOffset);
 until false;
until false;
FreeMem(lpBuf);
CloseHandle(hDir);
end;

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

Только не надо фраз типа "... а чё не судьба ...".

Просьба, как для особо непонятливого и лучше с примером.


petvv   (2009-03-16 12:07:00) [1]

Вот это конкретно. Ткнули мордой и все довольны


Palladin   (2009-03-16 11:47:00) [2]

а чё не судьба статью почитать? http://www.delphimaster.ru/articles/panov/


Наверх

Титульная страница Поиск, карта сайта Написать письмо