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

Вниз

Изменение файла   Найти похожие ветки 

 
elserpiente   (2007-05-18 15:22) [0]

как в WinAPI можно узнать об изменении указанного файла?


 
clickmaker ©   (2007-05-18 15:26) [1]

FindFirstChangeNotification()
ReadDirectoryChangesW()


 
Сергей М. ©   (2007-05-18 15:27) [2]

см. ReadDirectoryChangesW


 
elserpiente   (2007-05-18 15:34) [3]

пасибо ;)


 
elserpiente   (2007-05-18 15:56) [4]

в ReadDirectoryChangesW второй параметр lpBuffer какого типа должен быть?
есть ли делфи аналог FILE_NOTIFY_INFORMATION?


 
Сергей М. ©   (2007-05-18 16:07) [5]


> параметр lpBuffer какого типа должен быть?


Pointer


> есть ли делфи аналог FILE_NOTIFY_INFORMATION?


PFileNotifyInformation = ^FILE_NOTIFY_INFORMATION;
FILE_NOTIFY_INFORMATION = packed record
 NextEntryOffset: DWORD;
 Action: DWORD;
 FileNameLength: DWORD;
 FileName: Array[0..0] Of WideChar;
end;


 
elserpiente   (2007-05-18 16:09) [6]


> FileName: Array[0..0] Of WideChar;

0..0 - что это?


 
SLoW.AlfaMoon.Com   (2007-05-18 16:14) [7]

0..0 - что это?

--- оригинальный способ задания массива любой размерности.


 
elserpiente   (2007-05-18 17:09) [8]

PFileNotifyInformation = ^FILE_NOTIFY_INFORMATION;
FILE_NOTIFY_INFORMATION = packed record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: Array[0..0] Of WideChar;
end;

.....

var
 hWnd: THandle;
 FNI: PFileNotifyInformation;
 BytesReturned: integer;

.....

 hWnd := FindFirstChangeNotification("c:\", False,   FILE_NOTIFY_CHANGE_FILE_NAME);
 new(FNI);
 if hWnd <> INVALID_HANDLE_VALUE then
 while true do
 begin
   ZeroMemory(FNI, sizeof(FILE_NOTIFY_INFORMATION));

   if WaitForSingleObject(hWnd, 500) = WAIT_OBJECT_0 then
   begin
     ReadDirectoryChangesW(
       hWnd,
       FNI,
       sizeof(FNI),
       False,
       FILE_NOTIFY_CHANGE_FILE_NAME,
       @BytesReturned,
       nil, nil);
     if BytesReturned > 0 then
       Caption := "ok";

   end;
   FindNextChangeNotification(hWnd);
 end;

Создаю/удаляю файл, брейкопоинт срабатывает, однако, в FNI ничего нет? Чо не так


 
clickmaker ©   (2007-05-21 12:41) [9]

Parameters
hDirectory
[in] The handle to the directory to be monitored. This directory must be opened with the FILE_LIST_DIRECTORY access right.
(c) MSDN

и причем тут FindFirstChangeNotification?


 
Leonid Troyanovsky ©   (2007-05-21 18:55) [10]


> SLoW.AlfaMoon.Com   (18.05.07 16:14) [7]

> 0..0 - что это?

> --- оригинальный способ задания массива любой размерности.

Просто дословный перевод msdn: WCHAR FileName[1].

Задать же таким способом массив сейчас не удастся, скажем, в
turbo delphi: Constant expression violates subrange bounds (x1012)
при попытке обратится к ненулевому элементу.

Т.е., если хочется массив, то
1. объявлять надо FileName: Array[0..очень_большое_число_WCHAR] Of WideChar,
2. распределять для переменной типа PFileNotifyInformation столько,
сколько не жалко.
3. следить за превышением FileNameLength.

Только, в данном случае, оно не надо, бо для строки вполне достаточно
адреса ее начала (нулевого символа) и ее длины.

--
Regards, LVT.


 
SLoW.AlfaMoon.Com   (2007-05-22 09:31) [11]

Leonid Troyanovsky ©   (21.05.07 18:55) [10]

Как обстоят дела в Turbo Delphi, я не знаю. Но в Delphi 6-7 и ранее такой трюк срабатывает.

Т.е., я могу объявить что-то типа

SYSTEM_HANDLE_INFORMATION_EX=record
 dwCount: DWORD;
 Info: array[0..0] of SYSTEM_HANDLE_INFORMATION
end;

Пpи этом, получив как результат вызова ZwQuerySystemInformation данный буфер, могу обращаться к элементам массива Info, самолично следя за корректностью адресации. Если в Turbo Delphi такой возможности нет - это большое упущение.



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

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

Наверх




Память: 0.49 MB
Время: 0.027 c
2-1194450966
Kick
2007-11-07 18:56
2007.12.02
UDPClient, UDPServer, TCPClient, TCPServer


3-1184657924
Term
2007-07-17 11:38
2007.12.02
Создание TDataSet


11-1179477505
=BuckLr=
2007-05-18 12:38
2007.12.02
Вопрос по consoleOut


5-1163595817
Vladix
2006-11-15 16:03
2007.12.02
Прозрачный компонент (наследник TWinControl)


2-1194425186
lobach
2007-11-07 11:46
2007.12.02
ListBox