Конференция "Сети" » Для опытного глаза
 
  • Dennis I. Komarov © (30.10.07 17:23) [60]
    А если к примеру в этом месте происходит событие (Появился/удалился новый файл), то вернувшись в начало цикла WaitFor... получит эту информацию?
  • Сергей М. © (31.10.07 08:22) [61]

    > получит эту информацию?


    ПРобуй и поймешь)
  • Dennis I. Komarov © (31.10.07 09:06) [62]
    > [61] Сергей М. ©   (31.10.07 08:22)

    Тогда уже поздно будет :(
  • Dennis I. Komarov © (31.10.07 12:57) [63]
    А как попрыгать по 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
  • Сергей М. © (31.10.07 13:40) [64]

    > Dennis I. Komarov ©   (31.10.07 12:57) [63]


    > CopyMemory(x, TempBuf, SizeOf(x^);


    Сравни с:

    CopyMemory(tempBuf, lpBuf, NumberOfBytesTansferred)

    Найди семь отличий
  • Dennis I. Komarov © (31.10.07 14:48) [65]
    > [64] Сергей М. ©   (31.10.07 13:40)

    Copy Memory(Адрес получателся, адрес источника, Количество байт)

    Что не так?

    x: PFileNotifyInformation; - адрес куда скопирукм одну запись
    tempBuf - временный буфер содержащий все записи
    SizeOf(x^) - Розмер записи содержащейся по адресу x
  • Сергей М. © (31.10.07 15:34) [66]

    > адрес куда скопирукм одну запись


    Почему одну-то ?
    Все записи разом нужно копировать, если тебя волнует максимально быстрая обработка события !
  • Dennis I. Komarov © (31.10.07 15:42) [67]
    Неее

    CopyMemory(tempBuf, lpBuf, NumberOfBytesTansferred)

    Мы сделали временный буфер в tempBuf.
    Далее мы с чистой совестью можем запустить ReadDir...
    Теперь нам надо пробежаться по tempBuf и считать всю инфу.
    в x хочу считать первую запись, затем смещать позицию на x^.NextEntryOffset. Как - не знаю :(
  • Сергей М. © (31.10.07 16:15) [68]
    pInfo: PFileNotifyInformation;
    ..

    pInfo := tempBuf;
    repeat
     ..  pInfo указывает на очередную запись ..
     Inc(Cardinal(pInfo),  NextEntryOffset);
    until NextEntryOffset = 0;
  • Dennis I. Komarov © (31.10.07 16:24) [69]
    > [68] Сергей М. ©   (31.10.07 16:15)
    > Inc(Cardinal(pInfo),  NextEntryOffset);

    Вот его-то мне и не хватало :) И так я его и эдак. Мерси!
  • Сергей М. © (31.10.07 17:07) [70]

    > И так я его и эдак


    Мартышка и очки ?)

    Паскаль-то учить надо)
  • Dennis I. Komarov © (31.10.07 17:19) [71]
    В указателях пробел :(
  • Dennis I. Komarov © (31.10.07 17:35) [72]
    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 я пологаю перестарался.
  • Сергей М. © (01.11.07 08:36) [73]

    > SizeOf(lpBuf)


    У попа была собака...

    см. [24]
  • iXT (02.11.07 13:25) [74]
    Да, бывает :(
    Paste блин.

    А с сетевами (причем не win-выми) дисками она работать должна?
  • Dennis I. Komarov © (02.11.07 14:27) [75]
    Ух ты, старый ник просочился :)
  • Dennis I. Komarov © (07.11.07 16:36) [76]
    > А с сетевами (причем не win-выми) дисками она работать должна?

    НЕ БУДЕТ :(
 
Конференция "Сети" » Для опытного глаза
Есть новые Нет новых   [134431   +10][b:0][p:0.001]