Главная страница
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.012 c
2-1236764497
Новичек
2009-03-11 12:41
2009.04.26
Программное изменение владельца файла.


2-1236745264
Руслан
2009-03-11 07:21
2009.04.26
как обратиться к результату Query1 с Query2


15-1234884844
Baks
2009-02-17 18:34
2009.04.26
Рисунки для игры


2-1237192533
petvv
2009-03-16 11:35
2009.04.26
Отслеживание изменений ФС


2-1237201177
Pavel
2009-03-16 13:59
2009.04.26
Работа с WordDocument