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

Вниз

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

 
maxim161 ©   (2006-01-28 18:48) [0]

Люди, подскажите мне, Как мне следить за изменением файловой системы, например, кто-то хотит удалить файл, а тут, как на зло, появляется сообщение "Нельзя!", и узнать имя удаляемого файла...


 
kaZaNoVa ©   (2006-01-28 19:04) [1]

перехват DeleteFile()  :)) ?


 
maxim161 ©   (2006-01-28 20:21) [2]

А подробнее, please?


 
kaZaNoVa ©   (2006-01-28 20:28) [3]

тут раньше был код перехватов WinAPI-функций .. но он очень большой .. и там много разных ньюансов...
и возможно файл может быть удален не только через DeleteFile но и даже к примеру созданием файла с таким же именем (пустого) .. в общем случае задача довольно сложна ..

имхо проще вообще не давать прав на запись тогда и давать их тока тогда  когда потребуется ..


 
kaZaNoVa ©   (2006-01-28 20:30) [4]

вот "следить" то конечно можно и довольно просто, а "запрещать" удаления -и вообще влиять на что-то сложнее ..


 
maxim161 ©   (2006-01-28 20:44) [5]

Ну а следить как?


 
kaZaNoVa ©   (2006-01-28 20:50) [6]

maxim161 ©   (28.01.06 20:44) [5]
Ну а следить как?

смотреть в сторону ReadDirectoryChangesW


 
kaZaNoVa ©   (2006-01-28 20:51) [7]

пример работы с ней: (не мой)
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, StdCtrls, ExtCtrls, ClipBrd;
const
BUF_SIZE = 2048;

procedure WorkThread(LV : TListView);stdcall;
var
hDir : THandle;

lpBuf : Pointer;
Ptr   : Pointer;

cbReturn : Cardinal;
FileName : PWideChar;

Item : TListItem;
sTime : _SYSTEMTIME;
begin
// Сначала нам надо получить описатель каталога, за которым мы будем следить
// В данном примере это будет весь диск C:
hDir := CreateFile ("C:\",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;

// Выделяем память под буфер
// const BUF_SIZE = 2048 - думаю вполне достаточно
GetMem(lpBuf,BUF_SIZE);

repeat
// очищаем память перед записью в нее (на всякий случай)
ZeroMemory(lpBuf,BUF_SIZE);

// Теперь мы будем ждать пока чего-нибудь в интересующем нас каталоге
// изменится или произойдет ошибка (и мы выйдем из цикла)
// FILE_NOTIFY_CHANGE - это список флагов - о них ниже.
if not ReadDirectoryChangesW(hDir,lpBuf,BUF_SIZE,true,
FILE_NOTIFY_CHANGE_FILE_NAME  +  FILE_NOTIFY_CHANGE_DIR_NAME + FILE_NOTIFY_CHANGE_LAST_WRITE,@cbReturn,nil,nil)
 then Break;

// Сюда мы попадаем, если функция выполнилась успешно
// и lpBuf указывает на одну или несколько структур FILE_NOTIFY_INFORMATION
Ptr:=lpBuf;
repeat
 // Добавляем новый элемент в TListView (ViewStyle = vsReport )
 Item := LV.Items.Add;

 // Выделяем память под имя файла. Вот именно слово PFileNotifyInformation нужно как-то объявить, ноя не знаю как, а может какуюто библиотеку нужно подключить:
 GetMem(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);//Ошибка
 // Очищаем память - чтобы последним символом после копирования
 // был бы #0 нуль
 ZeroMemory(FileName,PFileNotifyInformation(Ptr).FileNameLength+2);
 // WinAPI функция для копирования Unicode строки
 lstrcpynW(FileName,PFileNotifyInformation(Ptr).FileName,
           PFileNotifyInformation(Ptr).FileNameLength div 2+1);
 // Имя файла у нас дается относительно папки
 // т.е.если изменится файл C:\File\test.dat, то FileName
 // будет равно File\test.dat
 Item.Caption:="C:\"+FileName;
 // Имя файла нам больше не нужно - очищаем память
 FreeMem(FileName);

 // Определяем тип произошедшего действия
 case PFileNotifyInformation(Ptr).Action of
  FILE_ACTION_ADDED    : Item.SubItems.Add("Файл был создан");
  FILE_ACTION_REMOVED  : Item.SubItems.Add("Файл был удален");
  FILE_ACTION_MODIFIED : Item.SubItems.Add("Файл был изменен");
  FILE_ACTION_RENAMED_OLD_NAME :
 Item.SubItems.Add("Файл был переименован и в имени файла - предыдущее имя");
  FILE_ACTION_RENAMED_NEW_NAME :
Item.SubItems.Add("новое имя после переименования");
  else Item.SubItems.Add("Произошло что-то странное");
 end;

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

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

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

until false;

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


 
Alex Konshin ©   (2006-01-29 02:04) [8]

Все намного проще. Нужно не рагировать на удаление, а не допускать его. Достаточно просто настроить права доступа.



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

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

Наверх




Память: 0.49 MB
Время: 0.555 c
1-1142228039
Glex
2006-03-13 08:33
2006.04.16
Браузер на основе TWebBrowser.


15-1143032556
MBo
2006-03-22 16:02
2006.04.16
Эксперт для использования в BDS хелпа от D7 или D6


2-1144004837
dimodim
2006-04-02 23:07
2006.04.16
Mailslotный чат


2-1143691956
vegarulez
2006-03-30 08:12
2006.04.16
Подскажите плиз.... как загружать рисунок на форму?


15-1143311184
u-12
2006-03-25 21:26
2006.04.16
Какой язык лучше для моделирования?