Текущий архив: 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.45 MB
Время: 0.005 c