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

Вниз

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

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

Наверх




Память: 0.51 MB
Время: 0.042 c
2-1123945723
Саша У
2005-08-13 19:08
2005.09.25
Как правильно сделать одинаковые обработчики для нескольких компо


14-1125679258
Джо
2005-09-02 20:40
2005.09.25
Delphi 2005 - Generate XML documentation


14-1125945109
Imbalancer
2005-09-05 22:31
2005.09.25
Need help VBA


8-1115883781
Fl@sh
2005-05-12 11:43
2005.09.25
TBitMap


1-1125567929
zhlob
2005-09-01 13:45
2005.09.25
Типы в C# и Delphi