-
А если к примеру в этом месте происходит событие (Появился/удалился новый файл), то вернувшись в начало цикла WaitFor... получит эту информацию?
-
> получит эту информацию?
ПРобуй и поймешь)
-
> [61] Сергей М. © (31.10.07 08:22)
Тогда уже поздно будет :(
-
А как попрыгать по tempBuf?
делаю так:
var x: PFileNotifyInformation;
.... память для x тоже выделили ....
repeat CopyMemory(x, TempBuf, SizeOf(x^); if x^.Action = FILE_ACTION_ADDED then begin .... end; //Тут надо перенести указатель tempBuf на x^.NextEntryOffset или CopyMemory(x, TempBuf + AnyBytes, SizeOf(x^)) until x^.NextEntryOffset > 0
-
> Dennis I. Komarov © (31.10.07 12:57) [63]
> CopyMemory(x, TempBuf, SizeOf(x^);
Сравни с:
CopyMemory(tempBuf, lpBuf, NumberOfBytesTansferred)
Найди семь отличий
-
> [64] Сергей М. © (31.10.07 13:40)
Copy Memory(Адрес получателся, адрес источника, Количество байт)
Что не так?
x: PFileNotifyInformation; - адрес куда скопирукм одну запись tempBuf - временный буфер содержащий все записи SizeOf(x^) - Розмер записи содержащейся по адресу x
-
> адрес куда скопирукм одну запись
Почему одну-то ? Все записи разом нужно копировать, если тебя волнует максимально быстрая обработка события !
-
Неее
CopyMemory(tempBuf, lpBuf, NumberOfBytesTansferred)
Мы сделали временный буфер в tempBuf. Далее мы с чистой совестью можем запустить ReadDir... Теперь нам надо пробежаться по tempBuf и считать всю инфу. в x хочу считать первую запись, затем смещать позицию на x^.NextEntryOffset. Как - не знаю :(
-
pInfo: PFileNotifyInformation; ..
pInfo := tempBuf; repeat .. pInfo указывает на очередную запись .. Inc(Cardinal(pInfo), NextEntryOffset); until NextEntryOffset = 0;
-
> [68] Сергей М. © (31.10.07 16:15) > Inc(Cardinal(pInfo), NextEntryOffset);
Вот его-то мне и не хватало :) И так я его и эдак. Мерси!
-
> И так я его и эдак
Мартышка и очки ?)
Паскаль-то учить надо)
-
В указателях пробел :(
-
unit u_send;
interface
uses Classes, Windows, SysUtils, StrUtils, DateUtils, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP, IniFiles;
type TThreadSend = class(TThread) private { Private declarations }
protected procedure Execute; override;
end;
implementation
uses Main;
{ TThreadSend } type PFileNotifyInformation = ^TFileNotifyInformation; TFileNotifyInformation = record NextEntryOffset: DWORD; Action: DWORD; FileNameLength:DWORD; FileName: WideChar; end;
procedure TThreadSend.Execute;
var // FTP: TIdFTP;
// SearchRec: TSearchRec; // FindResult: Integer;
// ClientCode: string; // FTPLogin: string;
// HomeDir: string;
f: TextFile; FileName: TFileName; hDir, hDirChangeEvent: THandle;
tempBuf: Pointer; lpBuf: Pointer; lpOverlapped: POverlapped; pInfo: PFileNotifyInformation;
lpNumberOfBytesTansferred: Cardinal; begin { Place thread code here } fileName:= 'c:\new.log'; AssignFile(f, FileName);
FreeOnTerminate:=true; hDirChangeEvent:=CreateEvent(nil, false, false, PChar('OnChangeDirecory')); hDir := CreateFile (BCDir, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0); if hDir <> INVALID_HANDLE_VALUE then begin GetMem(lpBuf, 64*1024); GetMem(lpOverlapped, SizeOf(lpOverlapped^)); // GetMem(pInfo, SizeOf(pInfo^)); try ZeroMemory(lpBuf, 64*1024); lpOverlapped^.hEvent:=hDirChangeEvent; if ReadDirectoryChangesW(hDir, lpBuf, SizeOf(lpBuf), true, FILE_NOTIFY_CHANGE_FILE_NAME, nil, lpOverlapped, nil) then while not Terminated do begin if (WaitForSingleObject(hDirChangeEvent, 1000) = WAIT_OBJECT_0) and (GetOverLappedResult(hDir, lpOverlapped^, lpNumberOfBytesTansferred, true)) then begin GetMem(tempBuf, lpNumberOfBytesTansferred); try //Копируем результаты в резервный буфер CopyMemory(tempBuf, lpBuf, lpNumberOfBytesTansferred); if not ReadDirectoryChangesW(hDir, lpBuf, SizeOf(lpBuf), true, FILE_NOTIFY_CHANGE_FILE_NAME, nil, lpOverlapped, nil) then ; //Тут все плохо, запрос не посавился смотреть GetLastError //А тут теперь пытаемся разобрать tempBuf pInfo:=tempBuf; repeat if pInfo^.Action = FILE_ACTION_ADDED then begin //Надо отправить файлик :) //Пока, что, для проверки заведем файлик типа LOG if FileExists(FileName) then Append(f) else rewrite(f); WriteLn(f, DateTimeToStr(Now) + ' - появился новый файл: ' + pInfo^.FileName); CloseFile(f); end; Inc(Cardinal(pInfo), pInfo^.NextEntryOffset); until pInfo^.NextEntryOffset = 0 finally FreeMem(tempBuf); end; end; end; finally FreeMem(lpBuf); FreeMem(lpOverlapped); // FreeMem(pInfo); CloseHandle(hDirChangeEvent); CloseHandle(hDir); end; end; end;
end.
Начались опыта на кошках. AV на выделенной строке ??? Ну ес-но при новом файле :) Почему нету pInfo? ЗЫ с GetMem для pInfo я пологаю перестарался.
-
> SizeOf(lpBuf)
У попа была собака...
см. [24]
-
Да, бывает :( Paste блин.
А с сетевами (причем не win-выми) дисками она работать должна?
-
Ух ты, старый ник просочился :)
-
> А с сетевами (причем не win-выми) дисками она работать должна?
НЕ БУДЕТ :(
|