Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.07.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.006 c
1-91746
Rater
2003-07-11 15:25
2003.07.28
Если на компьютере крупный шрифт


1-91740
Salvator
2003-07-15 09:53
2003.07.28
Работа с Dll


3-91638
prihod
2003-07-04 17:00
2003.07.28
Какой оптимальный языковой драйвер для таблиц FoxPro


3-91678
Salvator
2003-06-26 12:18
2003.07.28
Какой тип базы данных лучше использовать?


14-91862
Князь Мышкин
2003-07-11 12:03
2003.07.28
Делфи для микроконтроллеров





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский