Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  11:06[Войти] | [Зарегистрироваться]
Ответ на вопрос № 33799

21-07-2005 03:38
Господа!
Подскажите пожалуйста срочно.
Вот есть код:
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);

PFileNotifyInformation(Ptr).FileName -delphi говорит не знаю!
в чём проблема? может я чего не подключил?
Заранее спасибо.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

10-03-2008 16:36 | Комментарий к предыдущим ответам
Вопрос 52323

10-03-2008 10:06 | Комментарий к предыдущим ответам
Небольшой модинг:


uses
  Windows, Classes, SysUtils;

const

  FILE_NOTIFY_CHANGE = FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME or
  FILE_NOTIFY_CHANGE_ATTRIBUTES or FILE_NOTIFY_CHANGE_SIZE or
  FILE_NOTIFY_CHANGE_LAST_WRITE or FILE_NOTIFY_CHANGE_LAST_ACCESS or
  FILE_NOTIFY_CHANGE_CREATION or FILE_NOTIFY_CHANGE_SECURITY;

type

  TCreateEvent  = procedure (Sender: TObject; const FileName: string) of object;
  TDeleteEvent  = procedure (Sender: TObject; const FileName: string) of object;
  TRefreshEvent = procedure (Sender: TObject; const FileName: string) of object;
  TRenameEvent  = procedure (Sender: TObject; const FileName: string; const NewFileName: string) of object;

  PFileNotifyInformation = ^TFileNotifyInformation;
  TFileNotifyInformation = packed record
    NextEntryOffset: dword;
    Action: dword;
    FileNameLength: dword;
    FileName: WideChar;
  end;

  TFileThread = class(TThread)
  private
    FOnCreate: TCreateEvent;
    FOnDelete: TDeleteEvent;
    FOnRefresh: TRefreshEvent;
    FOnRename: TRenameEvent;
    FOnChange: TNotifyEvent;
    FDir: string;
    FChild: Boolean;
    FSync: Boolean;
  protected
    procedure Stack; virtual;
    procedure Execute; override;
    procedure DoCreate(const FileName: string);
    procedure DoDelete(const FileName: string);
    procedure DoRefresh(const FileName: string);
    procedure DoRename(const FileName: string; const NewFileName: string);
    procedure DoChange; virtual;
  public
    constructor Create(CreateSuspended: Boolean);
    property  OnCreate: TCreateEvent read FOnCreate write FOnCreate;
    property  OnDelete: TDeleteEvent read FOnDelete write FOnDelete;
    property  OnRefresh: TRefreshEvent read FOnRefresh write FOnRefresh;
    property  OnRename: TRenameEvent read FOnRename write FOnRename;
    property  OnChange: TNotifyEvent read FOnChange write FOnChange;
    property  Dir: string read FDir write FDir;
    property  Child: Boolean read FChild write FChild;
    property  Sync: Boolean read FSync write FSync;
  end;

  TFileChange = class(TFileThread);

implementation

constructor TFileThread.Create(CreateSuspended: Boolean);
begin
  FDir := '';
  FChild := false;
  FSync := false;
  inherited Create(CreateSuspended);
end;

procedure TFileThread.Stack;
var
  hDir, cbReturn: dword;
  lpBuf: pointer;
  Ptr: PFileNotifyInformation;
  FileName: PWideChar;
  OldName: WideString;
const
  BUF_SIZE = 256;
begin
  if FDir = '' then Exit;
  hDir:=CreateFile(PChar(FDir+PathDelim), 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 Exit;
  GetMem(lpBuf, BUF_SIZE);
  ZeroMemory(lpBuf, BUF_SIZE);
  if(ReadDirectoryChangesW(hDir, lpBuf, BUF_SIZE, FChild, FILE_NOTIFY_CHANGE, @cbReturn, nil, nil))
  or (cbReturn <> 0) then
  begin
  Ptr := lpBuf;
  OldName :='';
  repeat
    GetMem(FileName,Ptr^.FileNameLength+2);
    ZeroMemory(FileName,Ptr^.FileNameLength+2);
    LstrcpynW(FileName,addr(Ptr^.FileName),Ptr.FileNameLength div 2+1);
    case Ptr.Action of
          FILE_ACTION_ADDED: DoCreate(FDir+PathDelim+FileName);
          FILE_ACTION_REMOVED: DoDelete(FDir+PathDelim+FileName);
          FILE_ACTION_MODIFIED: DoRefresh(FDir+PathDelim+FileName);
          FILE_ACTION_RENAMED_OLD_NAME: OldName := FileName;
          FILE_ACTION_RENAMED_NEW_NAME: DoRename(FDir+PathDelim+OldName, FDir+PathDelim+FileName);
    end;
    FreeMem(FileName);
    if Ptr^.NextEntryOffset = 0 then break else
    Inc(Cardinal(Ptr),Ptr^.NextEntryOffset);
  until false;
  end;
  FreeMem(lpBuf);
  CloseHandle(hDir);
end;

procedure TFileThread.Execute;
begin
  while not Terminated do
  begin
    if FSync then Synchronize(Stack) else Stack;
    DoChange;
  end;
end;

procedure TFileThread.DoChange;
begin
  if Assigned(FOnChange) then FOnChange(Self);
end;

procedure TFileThread.DoCreate(const FileName: string);
begin
  if Assigned(FOnCreate) then FOnCreate(Self, FileName);
end;

procedure TFileThread.DoDelete(const FileName: string);
begin
  if Assigned(FOnDelete) then FOnDelete(Self, FileName);
end;

procedure TFileThread.DoRefresh(const FileName: string);
begin
  if Assigned(FOnRefresh) then FOnRefresh(Self, FileName);
end;

procedure TFileThread.DoRename(const FileName: string; const NewFileName: string);
begin
  if Assigned(FOnRename) then FOnRename(Self, FileName, NewFileName);
end;


27-02-2008 17:13 | Комментарий к предыдущим ответам
Если кто не понял:


procedure TFileThread.Stack;
var
  hDir, cbReturn: dword;
  lpBuf: pointer;
  Ptr: PFileNotifyInformation;
  FileName: PWideChar;
  OldName: WideString;
const
  BUF_SIZE = 256;
begin
  hDir:=CreateFile(PChar(FPath), 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 Exit;
  GetMem(lpBuf, BUF_SIZE);
  ZeroMemory(lpBuf, BUF_SIZE);
  if(ReadDirectoryChangesW(hDir, lpBuf, BUF_SIZE, true, FILE_NOTIFY_CHANGE, @cbReturn, nil, nil))
  or (cbReturn <> 0) then
  begin
  Ptr := lpBuf;
  OldName :='';
  repeat
    GetMem(FileName,Ptr^.FileNameLength+2);
    ZeroMemory(FileName,Ptr^.FileNameLength+2);
    LstrcpynW(FileName,addr(Ptr^.FileName),Ptr.FileNameLength div 2+1);
    case Ptr.Action of
          FILE_ACTION_ADDED: DoCreate(FPath+FileName);
          FILE_ACTION_REMOVED: DoDelete(FPath+FileName);
          FILE_ACTION_MODIFIED: DoRefresh(FPath+FileName);
          FILE_ACTION_RENAMED_OLD_NAME: OldName := FileName;
          FILE_ACTION_RENAMED_NEW_NAME: DoRename(FPath+OldName, FPath+FileName);
    end;
    FreeMem(FileName);
    if Ptr^.NextEntryOffset = 0 then break else
    Inc(Cardinal(Ptr),Ptr^.NextEntryOffset);
  until false;
  end;
  FreeMem(lpBuf);
  CloseHandle(hDir);
end;


27-02-2008 17:07 | Комментарий к предыдущим ответам
Ух блин - самое главное пропустил, старый файл попался, извеняйте...

Исправте строчку:

if Ptr^.NextEntryOffset = 0 then break else
Inc(Cardinal(Ptr),Ptr^.NextEntryOffset);

27-02-2008 15:32
Вот такой код я использую в с воей программе, надеюсь он правильный...


unit ShellFileChange;

{$WARNINGS OFF}
{$HINTS OFF}

interface

uses
  Windows, Classes, SysUtils;

const

  FILE_NOTIFY_CHANGE = FILE_NOTIFY_CHANGE_FILE_NAME or FILE_NOTIFY_CHANGE_DIR_NAME or
  FILE_NOTIFY_CHANGE_ATTRIBUTES or FILE_NOTIFY_CHANGE_SIZE or
  FILE_NOTIFY_CHANGE_LAST_WRITE or FILE_NOTIFY_CHANGE_LAST_ACCESS or
  FILE_NOTIFY_CHANGE_CREATION or FILE_NOTIFY_CHANGE_SECURITY;

type

  TCreateEvent  = procedure (Sender: TObject; const FileName: string) of object;
  TDeleteEvent  = procedure (Sender: TObject; const FileName: string) of object;
  TRefreshEvent = procedure (Sender: TObject; const FileName: string) of object;
  TRenameEvent  = procedure (Sender: TObject; const FileName: string; const NewFileName: string) of object;

  PFileNotifyInformation = ^TFileNotifyInformation;
  TFileNotifyInformation = packed record
    NextEntryOffset: dword;
    Action: dword;
    FileNameLength: dword;
    FileName: WideChar;
  end;

  TFileThread = class(TThread)
  private
    FOnCreate: TCreateEvent;
    FOnDelete: TDeleteEvent;
    FOnRefresh: TRefreshEvent;
    FOnRename: TRenameEvent;
    FOnChange: TNotifyEvent;
    FPath: string;
  protected
    procedure Stack; virtual;
    procedure Execute; override;
    procedure DoCreate(const FileName: string);
    procedure DoDelete(const FileName: string);
    procedure DoRefresh(const FileName: string);
    procedure DoRename(const FileName: string; const NewFileName: string);
    procedure DoChange; virtual;
  public
    constructor Create(const Path: string; CreateSuspended: Boolean);
    property  OnCreate: TCreateEvent read FOnCreate write FOnCreate;
    property  OnDelete: TDeleteEvent read FOnDelete write FOnDelete;
    property  OnRefresh: TRefreshEvent read FOnRefresh write FOnRefresh;
    property  OnRename: TRenameEvent read FOnRename write FOnRename;
    property  OnChange: TNotifyEvent read FOnChange write FOnChange;
  end;

  TFileChange = class(TFileThread);

implementation

constructor TFileThread.Create(const Path: string; CreateSuspended: Boolean);
begin
  FPath := Path;
  inherited Create(CreateSuspended);
end;

procedure TFileThread.Stack;
var
  hDir, cbReturn: dword;
  lpBuf: pointer;
  Ptr: PFileNotifyInformation;
  FileName: PWideChar;
  OldName: WideString;
const
  BUF_SIZE = 256;
begin
  hDir:=CreateFile(PChar(FPath), 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 Exit;
  GetMem(lpBuf, BUF_SIZE);
  ZeroMemory(lpBuf, BUF_SIZE);
  if(ReadDirectoryChangesW(hDir, lpBuf, BUF_SIZE, true, FILE_NOTIFY_CHANGE, @cbReturn, nil, nil))
  or (cbReturn <> 0) then
  begin
  Ptr := lpBuf;
  OldName :='';
  repeat
    GetMem(FileName,Ptr^.FileNameLength+2);
    ZeroMemory(FileName,Ptr^.FileNameLength+2);
    LstrcpynW(FileName,addr(Ptr^.FileName),Ptr.FileNameLength div 2+1);
    case Ptr.Action of
          FILE_ACTION_ADDED: DoCreate(FPath+FileName);
          FILE_ACTION_REMOVED: DoDelete(FPath+FileName);
          FILE_ACTION_MODIFIED: DoRefresh(FPath+FileName);
          FILE_ACTION_RENAMED_OLD_NAME: OldName := FileName;
          FILE_ACTION_RENAMED_NEW_NAME: DoRename(FPath+OldName, FPath+FileName);
    end;
    FreeMem(FileName);
    if Ptr^.NextEntryOffset = 0 then break;
    Inc(integer(Ptr),Ptr^.NextEntryOffset);
  until false;
  end;
  FreeMem(lpBuf);
  CloseHandle(hDir);
end;

procedure TFileThread.Execute;
begin
  while not Terminated do
  begin
    Stack;
    DoChange;
  end;
end;

procedure TFileThread.DoChange;
begin
  if Assigned(FOnChange) then FOnChange(Self);
end;

procedure TFileThread.DoCreate(const FileName: string);
begin
  if Assigned(FOnCreate) then FOnCreate(Self, FileName);
end;

procedure TFileThread.DoDelete(const FileName: string);
begin
  if Assigned(FOnDelete) then FOnDelete(Self, FileName);
end;

procedure TFileThread.DoRefresh(const FileName: string);
begin
  if Assigned(FOnRefresh) then FOnRefresh(Self, FileName);
end;

procedure TFileThread.DoRename(const FileName: string; const NewFileName: string);
begin
  if Assigned(FOnRename) then FOnRename(Self, FileName, NewFileName);
end;

end.


И его использование


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellFileChange;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure CreateEvent(Sender: TObject; const FileName: string);
    procedure DeleteEvent(Sender: TObject; const FileName: string);
    procedure RefreshEvent(Sender: TObject; const FileName: string);
    procedure RenameEvent(Sender: TObject; const FileName: string; const NewFileName: string);
    procedure ChangeEvent(Sender: TObject);
  end;

var
  Form1: TForm1;

  FileChange: TFileChange;

implementation

{$R *.dfm}

procedure TForm1.ChangeEvent(Sender: TObject);
begin
  Memo1.Lines.Add('Change');
  Sleep(100);
end;

procedure TForm1.CreateEvent(Sender: TObject; const FileName: string);
begin
  Memo1.Lines.Add('Create: '+FileName);
end;

procedure TForm1.DeleteEvent(Sender: TObject; const FileName: string);
begin
  Memo1.Lines.Add('Delete: '+FileName);
end;

procedure TForm1.RefreshEvent(Sender: TObject; const FileName: string);
begin
  Memo1.Lines.Add('Refresh: '+FileName);
end;

procedure TForm1.RenameEvent(Sender: TObject; const FileName: string; const NewFileName: string);
begin
  Memo1.Lines.Add('Rename: '+FileName+' to '+NewFileName);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FileChange := TFileChange.Create('C:\', false);
  FileChange.Priority := tpLowest;
  FileChange.OnCreate := CreateEvent;
  FileChange.OnDelete := DeleteEvent;
  FileChange.OnRefresh := RefreshEvent;
  FileChange.OnRename := RenameEvent;
  FileChange.OnChange := ChangeEvent;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FileChange.Terminate;
end;


27-02-2008 06:46
Советую всеже использовать ответ Python

27-02-2008 04:52
Можно сделать что то бодобное, но сразу говорю - что это только способ - он нагружает ЦП на 50%,
и проверяет только имеющиеся пути. Я писал этот код для своей программы, но
не стал его использовать.


TFileChange = class(TThread)
public
    procedure DoWork;
    procedure Execute; override;
end;

TFileListItem = class(TListItem)
private
    FFileName: TFileName;
    FFileAttr: Integer;
    FFileSize: Int64;
    FFileDate: TDate;
    FFileTime: TTime;
    FFileType: string;
public
    property FileName: TFileName read FFileName write FFileName;
    property FileAttr: Integer read FFileAttr write FFileAttr;
    property FileSize: Int64 read FFileSize write FFileSize;
    property FileDate: TDate read FFileDate write FFileDate;
    property FileTime: TTime read FFileTime write FFileTime;
    property FileType: string read FFileType write FFileType;
end;

procedure TFileChange.Execute;
begin
  while not Terminated do
  begin
  DoWork;
  Sleep(100);
  end;
end;

procedure TFileChange.DoWork;
var
  Item: TFileListItem;
  SearchRec:TSearchRec;
  I: Integer;
  SHFileInfo: TSHFileInfo;
begin

  if Form1.ListView1.Items.Count = 0 then Exit;

  for I:=0 to Form1.ListView1.Items.Count-1 do
  begin

    Item:=TFileLIstItem(Form1.ListView1.Items.Item[I]);

    if Item = nil then Exit;

    if Item.FileAttr and faDirectory = 0 then // Если это файл
    begin

      if Not FileExists(Item.FileName) then // Если файла нет то удаляем его из списка
      begin
      Form1.ListView_Delete(I);
      Break;
      end
      else
      begin 
        FindFirst(Item.FileName, faAnyFile, SearchRec); // иначе обновляем
        SHGetFileInfo(PChar(Item.FileName), faAnyFile, SHFileInfo, SizeOf(TSHFileInfo), SHGFI_TYPENAME);
        if (Item.FileAttr <> SearchRec.Attr) or
        (Item.FileSize <> SearchRec.Size) or
        (Item.FileDate <> FileDateToDateTime(SearchRec.Time)) or
        (Item.FileTime <> FileDateToDateTime(SearchRec.Time)) or
        (Item.FileType <> SHFileInfo.szTypeName) then
        begin
          Form1.ListView_Refresh(Item, SearchRec.Size, SearchRec.Attr, FileDateToDateTime(SearchRec.Time),
          FileDateToDateTime(SearchRec.Time),true);
        end;
        FindClose(SearchRec);
      end;

    end
    else
    begin
      if Not DirectoryExists(Item.FileName) then // Если директория не существует то удаляем из списка
      begin
      Form1.ListView_Delete(I);
      Break;
      end
      else
      begin
        FindFirst(Item.FileName, faAnyFile, SearchRec); // иначе обновляем
        SHGetFileInfo(PChar(Item.FileName), faAnyFile, SHFileInfo, SizeOf(TSHFileInfo), SHGFI_TYPENAME);
        if (Item.FileAttr <> SearchRec.Attr) or
        (Item.FileSize <> SearchRec.Size) or
        (Item.FileDate <> FileDateToDateTime(SearchRec.Time)) or
        (Item.FileTime <> FileDateToDateTime(SearchRec.Time)) or
        (Item.FileType <> SHFileInfo.szTypeName) then
        begin
          Form1.ListView_Refresh(Item, SearchRec.Size, SearchRec.Attr, FileDateToDateTime(SearchRec.Time),
          FileDateToDateTime(SearchRec.Time),true);
        end;
        FindClose(SearchRec);
      end;
    end;
   
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FileChange:=TFileChange.Create(false);
  FileChange.Priority:=tpLowest;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FileChange.Terminate;
  FileChange.Free;
end;


21-05-2007 03:54 | Сообщение от автора вопроса
Хочу снова поднять тему...
Код работает...добавление файлов фиксируется точно, а вот удаление - нет.
Точнее так: удаляем до 6ти файлов - фиксируются все, а если удалить больше файлов - фиксируется только первый удаленный.
Всю голову сломал...

10-03-2007 12:17 | Комментарий к предыдущим ответам
В догонку: если вместо
ReadDirectoryChangesW(hDir,lpBuf,BUF_SIZE,true,FILE_NOTIFY_CHANGE_FILE_NAME
  or FILE_NOTIFY_CHANGE_LAST_WRITE
,@cbReturn,nil,nil))
написать это:
ReadDirectoryChangesW(hDir,lpBuf,BUF_SIZE,true,FILE_NOTIFY_CHANGE_FILE_NAME,@cbReturn,nil,nil)) то всё ловится чётко...

10-03-2007 12:04 | Вопрос к автору: запрос дополнительной информации
У меня вопросик по коду, преведённому товарищем Python'ом:
вся эта конструкция работает...только одно НО :
Если, допустим, скопировать откудато штук 100 файлов(может даже меньше) в "мониторимый" каталог, то ReadDirectoryChangesW поймает только 2 или 3 файла(когда как) и вылетит из циклов...
В чём может быть проблема...или ОНО так и должно работать?

05-08-2005 11:06
>>> until false;
И хорошо, что программа не откомпилировалась. Потому что в нашем случае такая конструкция просто приводят к зависанию программы. Потому что во вложенном цикле нет команды break или exit, приводящих к завершению работы!
А PFileNotifyInformation просто нигде не объявлен (во всяком случае, я нигде не нашел его объявления). Поэтому его придется объявлять руками. Вот полный код:

procedure TForm1.Button1Click(Sender: TObject);
Const BUF_SIZE=256;
Type PFileNotifyInformation=^TFileNotifyInformation;
    TFileNotifyInformation=packed record
      NextEntryOffset:dword;
      Action:dword;
      FileNameLength:dword;
      FileName:WideChar;
    end;
var hDir,cbReturn:dword;
    lpBuf:pointer;
    Ptr:PFileNotifyInformation;
    FileName:PWideChar;
    OldName:widestring;
begin
hDir:=CreateFile('E:\EXE',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))or(cbReturn=0)then Break;
  // пользователь не сможет прервать ожидание, если захочет. Это нужно либо вынести в отдельный
  // поток, либо использовать синхронный ввод/вывод
  Ptr:=lpBuf;OldName:='';
  repeat
  GetMem(FileName,Ptr^.FileNameLength+2);
  ZeroMemory(FileName,Ptr^.FileNameLength+2);
  lstrcpynW(FileName,addr(Ptr^.FileName),Ptr.FileNameLength div 2+1);
  case Ptr.Action of // здесь нужно разместить реальные процедуры обработки данных
    FILE_ACTION_ADDED:ShowMessage('File '+FileName+' was created.');
    FILE_ACTION_REMOVED:ShowMessage('File '+FileName+' was removed.');
    FILE_ACTION_MODIFIED:ShowMessage('File '+FileName+' was modified.');
    FILE_ACTION_RENAMED_OLD_NAME:OldName:=FileName;
    FILE_ACTION_RENAMED_NEW_NAME:ShowMessage('File '+OldName+' renamed to '+FileName+'.');
  end;
  FreeMem(FileName);
  if Ptr^.NextEntryOffset=0 then break;
  Inc(integer(Ptr),Ptr^.NextEntryOffset);
  until false;
until false; // как пользователь сможет прервать работу вечного цикла? Выход происходит лишь по ошибке...
FreeMem(lpBuf); // этот код ни разу не вызывается - программа останется в цикле до первой ошибки
CloseHandle(hDir);
end;


Надеюсь, все понятно? Я просто переписал объявления в программу и исправил некоторые несуразицы в коде. Однако, программа на мой взгляд требует некоторой доработки (см. комментарии).

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Вода мокрая или сухая?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования