![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Стоит такая задача:
Есть папка в которую попадают файлы, надо мониторить папку и при попадании нового файла грузить его в оракл. Вот и вопрос: как мониторить папку? использование таймеров мне явно не подходит, как отследить событие попадания файлов в папку? и вообще как правильно организовывать такие системы? поделитесь опытом |
|
#2
|
||||
|
||||
|
Есть несколько решений, вот например нарыл на просторах инета:
Код:
type
PFileNotifyInformation = ^TFileNotifyInformation;
TFileNotifyInformation = record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: array [0..MAX_PATH - 1] of WideChar;
end;
....
procedure TForm1.Test;
const
Filter =
FILE_NOTIFY_CHANGE_FILE_NAME or
FILE_NOTIFY_CHANGE_DIR_NAME or
FILE_NOTIFY_CHANGE_ATTRIBUTES or
FILE_NOTIFY_CHANGE_SIZE or
FILE_NOTIFY_CHANGE_LAST_WRITE or
FILE_NOTIFY_CHANGE_LAST_ACCESS or
FILE_NOTIFY_CHANGE_CREATION or
FILE_NOTIFY_CHANGE_SECURITY;
var
Dir: THandle;
Notify: TFileNotifyInformation;
BytesReturned: DWORD;
begin
Dir := CreateFile('d:\', GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
if Dir <> INVALID_HANDLE_VALUE then
try
if not ReadDirectoryChangesW(Dir, @Notify, SizeOf(TFileNotifyInformation),
False, Filter, @BytesReturned, nil, nil) then
raise Exception.Create(SysErrorMessage(GetLastError))
else
case Notify.Action of
FILE_ACTION_ADDED: Memo1.Lines.Add('New file' + Notify.FileName);
FILE_ACTION_REMOVED: Memo1.Lines.Add('Delete file' + Notify.FileName);
FILE_ACTION_MODIFIED: Memo1.Lines.Add('Modify file' + Notify.FileName);
FILE_ACTION_RENAMED_OLD_NAME: Memo1.Lines.Add('Old Name file' + Notify.FileName);
FILE_ACTION_RENAMED_NEW_NAME: Memo1.Lines.Add('New Name file' + Notify.FileName);
end;
finally
CloseHandle(Dir);
end;
end; |