Форум: "Начинающим";
Текущий архив: 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