Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.04.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.006 c
3-1220008167
keymaster
2008-08-29 15:09
2009.04.26
GetTableNames возвращает пустоту


15-1235256218
alex-drob
2009-02-22 01:43
2009.04.26
Проэктирование сервера для обмена пакетами двух пользователей


2-1236664136
AIK
2009-03-10 08:48
2009.04.26
Access Violation


15-1234977774
vrem
2009-02-18 20:22
2009.04.26
Верить или не верить?


15-1235242573
Kerk
2009-02-21 21:56
2009.04.26
Задачка про поезд





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский