Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.28;
Скачать: CL | DM;

Вниз

ReadDirectoryChangesW   Найти похожие ветки 

 
Titan   (2003-05-24 11:09) [0]

Очень хотелось бы увидель пример правильной работы с данной функцией, т.е. как сформировать входные параметры, как проанализировать результаты работы. Help я читал (кстати, в D6 структура FILE_CHANGE_INFORMATION даже не описана, я ее по си-ному прототиту сам описал, может в этом и проблема, что не тот размер структуры). Она у меня в отдельном потоке работает, но все время False возвращает :-( Если не сложно, то вышлите пример исходника на мыло, а то времени в инете мало ;-(


 
AndreiR   (2003-05-24 14:04) [1]

Писал давно, много сходу не припоминаю :)
Надеюсь разберешься...
ПС: addRecord - моя процедура, которую нужно выполнить в порцессе работы нитки.

type
_FILE_NOTIFY_INFORMATION = record
NextEntryOffset : DWORD;
Action : DWORD;
FileNameLength : DWORD;
FileName : WCHAR;
end;
{$EXTERNALSYM _FILE_NOTIFY_INFORMATION}
TFileNotifyInformation = _FILE_NOTIFY_INFORMATION;
FILE_NOTIFY_INFORMATION = _FILE_NOTIFY_INFORMATION;
{$EXTERNALSYM _FILE_NOTIFY_INFORMATION}

.....

procedure TViewerThread.Execute;
var
FNI: ^FILE_NOTIFY_INFORMATION;
pBuffer,
pCurr: Pointer;
dwBufferLength: DWORD;
dwBytesReturned: DWORD;
pSrcFileName: PWCHAR;
pDstFileName: PWCHAR;
dwDstFileNameLength: DWORD;
FileName: String;
begin
while not Terminated do begin
dwBufferLength := 1024;
pBuffer := HeapAlloc(GetProcessHeap(), 0, dwBufferLength);
ZeroMemory(pBuffer, dwBufferLength);
if ReadDirectoryChangesW(
hDir,
pBuffer,
dwBufferLength,
TRUE,
FILE_NOTIFY_CHANGE_LAST_WRITE Or
FILE_NOTIFY_CHANGE_FILE_NAME Or
FILE_NOTIFY_CHANGE_DIR_NAME,
@dwBytesReturned,
nil,
nil
) then begin
pCurr := pBuffer;
while true do begin
FNI := pCurr;
if FNI^.FileNameLength > 0 then begin
pSrcFileName := @FNI^.FileName;
dwDstFileNameLength := FNI^.FileNameLength + SizeOf(WideChar);
pDstFileName := HeapAlloc(GetProcessHeap(), 0, dwDstFileNameLength);
ZeroMemory(pDstFileName, dwDstFileNameLength);
CopyMemory(pDstFileName, pSrcFileName, FNI^.FileNameLength);
FileName := WideCharToString(pDstFileName);
HeapFree(GetProcessHeap(), 0, pDstFileName);
end;

if not Terminated then begin
self.FileName := ansiLowerCase(RealPath + FileName);
case FNI^.Action of
FILE_ACTION_ADDED:
begin
index := true;
Synchronize(addRecord);
end;
FILE_ACTION_REMOVED:
begin
index := false;
Synchronize(addRecord);
end;
FILE_ACTION_MODIFIED:
begin
index := true;
Synchronize(addRecord);
end;
FILE_ACTION_RENAMED_OLD_NAME:
begin
index := false;
Synchronize(addRecord);
end;
FILE_ACTION_RENAMED_NEW_NAME:
begin
index := true;
Synchronize(addRecord);
end;
end;
end;
if FNI^.NextEntryOffset = 0 then
Break
else
Inc(PChar(pCurr), FNI^.NextEntryOffset);

end;
end else
ExitProcess(GetLastError());

HeapFree(GetProcessHeap(), 0, pBuffer);
end;
end;


 
Titan   (2003-05-26 06:54) [2]

Спасибо за ответ, с проблемой несрабатывания функции я и сам разобрался (просто неправильно папку открывал [hDir], и результате ничего не работало ;-(, но потом GetLastError давал ноль, но количество возвращенных байт = 0, это похоже я буфер слишком маленький делал... Сегодня попробую ваш вариант, надеюсь, сработает, еще раз спасибо, что откликнулись.



Страницы: 1 вся ветка

Текущий архив: 2003.07.28;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
14-91854
Soft
2003-07-11 11:38
2003.07.28
Как сойти с ума, программируя на Делфи?


8-91776
swamp
2003-04-05 12:35
2003.07.28
gluLookAt


6-91800
prihod
2003-05-20 17:09
2003.07.28
Как отправить письмо ???


7-91932
Leks
2003-05-16 22:11
2003.07.28
И снова СОМ порт...


14-91902
Чижик Пыжик
2003-07-11 22:48
2003.07.28
Разные сайты под одним IP адресом