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

Вниз

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

 
Vintik   (2005-07-28 07:55) [0]

Всем привет.Мастера помогите погибаю.Несколько дней не могу разобраться с ReadDirectoryChangesW.Первый вопрос такой каким типом должны быть объявленые в структуре параметры.2 как извлеч имя файла который был изменен в каталоге.Здесь на сайте есть пример,но не описаны папаметры.Если не затруднит приведите кто-нибуть полный пример буду очень пирзнателей.Спасибо


 
kblc ©   (2005-07-28 08:01) [1]

Тебе сюда: там ты много что найдёшь... http://search.microsoft.com/search/results.aspx?qu=ReadDirectoryChangesW&View=msdn&st=b&c=4&s=1&swc=4


 
Vintik   (2005-07-28 08:14) [2]

Мне бы примерчик.Это я уже читал.А реализовать не получается.


 
kblc ©   (2005-07-28 08:31) [3]

Вот те кусок кода - разбирайся ;)

.......
hDir := CreateFile ("C:\2",GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE
 or FILE_SHARE_DELETE,nil,OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS,0);
if hDir = INVALID_HANDLE_VALUE
 then begin ShowMessage(SysErrorMessage(GetLastError)); exit; end;
 GetMem(lpBuf,BUF_SIZE);
repeat
 ZeroMemory(lpBuf,BUF_SIZE);
 if not ReadDirectoryChangesW(hDir,lpBuf,BUF_SIZE,true,FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_LAST_WRITE,@cbReturn,nil,nil)
 then Break;
 Ptr:=lpBuf;
repeat
 GetMem(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);
 ZeroMemory(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);
 lstrcpynW(FileName,PFileNotifyInformation(Ptr).FileName,
 PFileNotifyInformation(Ptr).FileNameLength div 2+1);
 FreeMem(FileName);
 case PFileNotifyInformation(Ptr).Action of
   FILE_ACTION_ADDED    : Файл был создан;
   FILE_ACTION_REMOVED  : Файл был удален;
   FILE_ACTION_MODIFIED : Файл был изменен;
 until false;
until false;
FreeMem(lpBuf);
.....


 
Vintik   (2005-07-28 08:31) [4]

Подскажите какой тип должен иметь поле Action(действие)в структуре.И как можно определить тип произошедших действий(создание\удаление\.....?


 
Vintik   (2005-07-28 08:34) [5]

kblc © спасибо.Еще один вопросик опиши пожалуйтва структуру которую ты используешь в этом коде.В ней у меня как раз и вся проблема не могу понять какого типа в ней поля должны быть(PFileNotifyInformation и есть имя структуры.Да?)


 
kblc ©   (2005-07-28 08:40) [6]

typedef struct _FILE_NOTIFY_INFORMATION {  
   DWORD NextEntryOffset;  
   DWORD Action;  
   DWORD FileNameLength;  
   WCHAR FileName[1];
} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;


 
Vintik   (2005-07-28 08:44) [7]

Как это применить в Delphi.На примере приведенного тобой выше?
Я пробовал но что-то не очень вышло.


 
kblc ©   (2005-07-28 08:45) [8]

Объяви у себя:

type
 ...

 _FILE_NOTIFY_INFORMATION = record
   NextEntryOffset: DWORD;
   Action: DWORD;
   FileNameLength: DWORD;
   FileName: WIDECHAR;
 end;

 ...

 Кажется так... сейчас не вспомню...


 
kblc ©   (2005-07-28 08:47) [9]

а потом, уже после того что я тебе написал,
type
 ...
 PFileNotifyInformation = ^_FILE_NOTIFY_INFORMATION
 ...


 
Vintik   (2005-07-28 08:55) [10]

Спасибо надеюсь что теперь получится.


 
имя   (2005-07-28 10:39) [11]

Удалено модератором


 
Vinkti   (2005-07-28 13:36) [12]

С основным кодом все в порядке разбрался,но при попытке вывести имя файла вызвавшего изменение в Memo поле ни чего не выводится, такое ощущение создается,что в FileName ни чего нет.

GetMem(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);
ZeroMemory(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);
lstrcpynW(FileName,PFileNotifyInformation(Ptr).FileName,
PFileNotifyInformation(Ptr).FileNameLength div 2+1);
Помогите.


 
kblc ©   (2005-07-28 14:03) [13]

Попробуй FileName: string; заменить на FileName: WideString;, а после не использовать ф-ию lstrcpynW, а вместо этого написать FileName:=PFileNotifyInformation(Ptr).FileName; Что у тебя получилось?


 
Alexander Panov ©   (2005-07-28 14:27) [14]

procedure WorkThread(LV: TMemo);stdcall;
//(c) - Исходник взят(и адаптирован к себе) с
//http://delphiworld.narod.ru/base/read_directory_changes_w.html
//
var
HDir : THandle;
lpBuf : Pointer;
Ptr   : Pointer;
cbReturn : Cardinal;
FileName : PWideChar;
sTime : _SYSTEMTIME;
Index: Integer;
begin
 HDir := CreateFile (
   "x:\temp",
   GENERIC_READ,
   FILE_SHARE_READ or FILE_SHARE_WRITE,
   nil,
   OPEN_EXISTING,
   FILE_FLAG_BACKUP_SEMANTICS,
   0);

  if HDir = INVALID_HANDLE_VALUE then
  begin
   MessageBox(0,PChar(SysErrorMessage(GetLastError)),"Error",MB_OK);
   Exit;
  end;

 GetMem(lpBuf,BUF_SIZE);

 repeat

   ZeroMemory(lpBuf,BUF_SIZE);

   if not ReadDirectoryChangesW(hDir,lpBuf,BUF_SIZE,true,
            FILE_NOTIFY_CHANGE_LAST_WRITE+FILE_NOTIFY_CHANGE_FILE_NAME,@cbReturn,nil,nil) then
  begin
   MessageBox(0,PChar(SysErrorMessage(GetLastError)),"Error",MB_OK);
   Break;
  end;

 Ptr:=lpBuf;

 repeat
  GetMem(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);
  ZeroMemory(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);
  lstrcpynW(FileName,PFileNotifyInformation(Ptr).FileName,
            PFileNotifyInformation(Ptr).FileNameLength div 2+1);
  Index := LV.Lines.Add("X:\"+FileName);
  FreeMem(FileName);

  case PFileNotifyInformation(Ptr).Action of
   FILE_ACTION_ADDED    : LV.Lines[Index]:= LV.Lines[Index]+("Файл был создан");
   FILE_ACTION_REMOVED  : LV.Lines[Index]:= LV.Lines[Index]+("Файл был удален");
   FILE_ACTION_MODIFIED : LV.Lines[Index]:= LV.Lines[Index]+("Файл был изменен");
   FILE_ACTION_RENAMED_OLD_NAME :
  LV.Lines[Index]:= LV.Lines[Index]+("Файл был переименован и в имени файла - предыдущее имя");
   FILE_ACTION_RENAMED_NEW_NAME :
 LV.Lines[Index]:= LV.Lines[Index]+("новое имя после переименования");
   else LV.Lines[Index]:= LV.Lines[Index]+("Произошло что-то странное");
  end;

  // Время, когда произошло событие
  GetLocalTime(sTime);
  with sTime do
   LV.Lines[Index]:= LV.Lines[Index]+(Format(" %.2d:%.2d:%.2d",[wHour,wMinute,wSecond])); // 13:54:20

  // Если эта запись не последняя (NextEntryOffset < >  0), то...
  if PFileNotifyInformation(Ptr).NextEntryOffset=0
   then Break
    else begin
  // ... добавляем строку в примечания (если интересно посмотреть смещение)
     LV.Lines[Index]:= LV.Lines[Index]+(" Offset : "+
      IntToStr(PFileNotifyInformation(Ptr).NextEntryOffset));
  //Передвигаем указатель на NextEntryOffset байт вперед
     Inc(Cardinal(Ptr),PFileNotifyInformation(Ptr).NextEntryOffset);
  // Теперь Ptr указывает на следующую запись
    end;

 // Передвигать надо именно Ptr, а не lpBuf
 until false;

until false;

// Очищаем память
FreeMem(lpBuf);
end;


 
vintik   (2005-07-29 07:49) [15]

В структуре FileName:PWodeChar
в процедуре TMonDirThread.Execute;
FileName:PwideChar;
При написании FileName:=PFileNotifyInformation(Ptr).FileName
запускаю программу и поток,обращаюсь к папке мониторинга при создании,удалении .... файла программа вылетает с сообщением
............ошибки в моем модуле по адресу 004044EF.Read of address 04350422.
А если заменить на При написании FileName:=IntToStr(PFileNotifyInformation(Ptr).PFileNotifyInformation(Ptr).FileNameLength div 2+1);все в порядке выводит длину файла вызвавшего изменение.?????????????????


 
Vintik   (2005-07-29 10:49) [16]

Всем спасибо(особенно kblc очень сильно помог) разобрался просто в стуктуре надо было FileName объявить как строковый массив.И все пошло как по маслу.



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

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

Наверх




Память: 0.49 MB
Время: 0.037 c
1-1125917246
DesWind
2005-09-05 14:47
2005.09.25
Обясните смылсл данных действий.


2-1123831093
PChI
2005-08-12 11:18
2005.09.25
глюк try.... except или я тормоз


3-1123755014
Валерий
2005-08-11 14:10
2005.09.25
Непонятки с IN в динамическом SQL-е


14-1124948849
Хинт
2005-08-25 09:47
2005.09.25
Помогите разобраться с сетевыми интерфейсами


4-1122494084
Михаил(Киров)
2005-07-27 23:54
2005.09.25
Диспетчер задач





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский