ReadDirectoryChangesW
, с параметром BOOL bWatchSubtree = TRUE?MSDN сообщает, что если этот параметр имеет значение TRUE, функция отслеживает дерево каталогов с корнем в указанном каталоге.
Этот API только вернуть список PFILE_NOTIFY_INFORMATION
Ведьма содержит только информацию о названии файла.
В то время как я знаю, что подкаталог ведьмы находится в файле?
typedef struct _FILE_NOTIFY_INFORMATION {
DWORD NextEntryOffset;
DWORD Action;
DWORD FileNameLength;
WCHAR FileName[1];
} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
void Watch()
{
while(bShouldWatch)
{
if(::ReadDirectoryChangesW(hDir,
myOverLapped.notify,sizeof(myOverLapped.notify),
TRUE,
FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME,
0,&(myOverLapped.overlapped),0))
{
DWORD w=::WaitForSingleObject(myOverLapped.overlapped.hEvent,INFINITE);
if (w==WAIT_OBJECT_0){
FILE_NOTIFY_INFORMATION *pNotify=(FILE_NOTIFY_INFORMATION*)myOverLapped.notify;
HandleNotify(pNotify);
NotifyMsg(WM_PL_TRACKNUM_CHANGED,(WPARAM)pPL,NULL);
}
}
}}void HandleNotify(FILE_NOTIFY_INFORMATION *pNotify)
{
TCHAR szPath[MAX_PATH];
TCHAR pathFrom[MAX_PATH];
TCHAR pathTo[MAX_PATH];
memset(pathTo,0,sizeof(pathTo));
INT len=0;
while(1)
{
wcsncpy(pathTo+len,pNotify->FileName,pNotify->FileNameLength/sizeof(TCHAR));
switch(pNotify->Action)
{
case FILE_ACTION_ADDED:
break;
case FILE_ACTION_REMOVED:
break;
case FILE_ACTION_RENAMED_OLD_NAME:
break;
case FILE_ACTION_RENAMED_NEW_NAME:
break;
}
if(pNotify->NextEntryOffset!=0)
pNotify=(FILE_NOTIFY_INFORMATION*)((BYTE*)pNotify+pNotify->NextEntryOffset);
else break;
}
От документация [выделение мое]:
Имя файла
Поле переменной длины, которое содержит имя файла относительно дескриптора каталога.
Другими словами, если уведомление относится к файлу в подкаталоге, FileName
включает в себя относительный путь, например, он будет subdir\file.txt
а не просто file.txt
,