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

Вниз

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

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

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

Наверх





Память: 0.47 MB
Время: 0.038 c
1-1142394627
atruhin
2006-03-15 06:50
2006.04.16
Можно ли увиличить ширину ScrollBar


2-1143697782
mariya_mezenceva
2006-03-30 09:49
2006.04.16
аналог for each


15-1143467965
oldman
2006-03-27 17:59
2006.04.16
Как может поссорить ся контролер с винтом?


15-1143178950
Некто
2006-03-24 08:42
2006.04.16
Одна таблица или две?


2-1143730075
dubolom
2006-03-30 18:47
2006.04.16
Рисование





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