Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.26;
Скачать: CL | DM;

Вниз

Отслеживание изменений ФС   Найти похожие ветки 

 
petvv   (2009-03-16 11:35) [0]

Отслеживаю изменение ФС в определённой директории и при появлении нового файла преобразовываю его в 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, то оно применимо только для одноразового использования (поступает в директорию несколько файлов, а обрабатывается только первый). Как сделать, чтобы сей код постоянно фунциклировал и отслеживал изменения.

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

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


 
Palladin ©   (2009-03-16 11:47) [1]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.04.26;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.015 c
15-1235338204
Юрий
2009-02-23 00:30
2009.04.26
С днем рождения ! 23 февраля 2009 понедельник


2-1236872136
Бурато
2009-03-12 18:35
2009.04.26
Поиск


3-1219996681
KirillRepin
2008-08-29 11:58
2009.04.26
сортировка в DBGrid по клику на названии колонки


2-1236591711
Franzy
2009-03-09 12:41
2009.04.26
Указатели и работа с вирт. памятью


3-1220008167
keymaster
2008-08-29 15:09
2009.04.26
GetTableNames возвращает пустоту