| 
| 
 | Вопрос # 1 971/ вопрос открыт / | 
 |  Здравствуйте, эксперты! Помогите пожалуйста!!! Как можно узнать о том, что начался процесс копирования файлов с жёсткого диска на какой-либо носитель информации? Если возможно, подскажите как запретить этот процесс копирования перед тем как он начался?
 
|  |   Вопрос задал: Малыш (статус: Посетитель)Вопрос отправлен: 6 октября 2008, 02:24
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Feniks Здравствуйте, Малыш!Можно, но очень сложно. Вам надо копать в сторону FindFirstChangeNotification, FindNextChangeNotification, FindCloseChangeNotification вместе с WaitForSingleObject. А так же смотрите пример в приложении. В нем отслеживается создание/изменение/удаление файлов.
 
 P.S. Желаю удачи.
 Приложение:Переключить в обычный режим unit wfsU; interface type  PInfoCallback = ^TInfoCallback;TInfoCallback = record    end;  TWatchFileSystemCallback = procedure (pInfo: TInfoCallback);       procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback:
TWatchFileSystemCallback); procedure StopWatch; implementation usesClasses, Windows, SysUtils; constFILE_LIST_DIRECTORY   = $0001; typePFileNotifyInformation = ^TFileNotifyInformation;TFileNotifyInformation = record   NextEntryOffset : DWORD;   Action          : DWORD;   FileNameLength  : DWORD;   FileName        : array[0..0] of WideChar;end; WFSError = class(Exception); TWFS = class(TThread)private   FName           : string;   FFilter         : Cardinal;   FSubTree        : boolean;   FInfoCallback   : TWatchFileSystemCallback;   FWatchHandle    : THandle;   FWatchBuf       : array[0..4096] of Byte;   FOverLapp       : TOverlapped;   FPOverLapp      : POverlapped;   FBytesWritte    : DWORD;   FCompletionPort : THandle;   FNumBytes       : Cardinal;   FOldFileName    : string;   function CreateDirHandle(aDir: string): THandle;   procedure WatchEvent;   procedure HandleEvent;protected   procedure Execute; override;public   constructor Create(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback:
TWatchFileSystemCallback);   destructor Destroy; override;end;  varWFS : TWFS; procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback:
TWatchFileSystemCallback);beginWFS:=TWFS.Create(pName, pFilter, pSubTree, pInfoCallback);end; procedure StopWatch;varTemp : TWFS;beginif Assigned(WFS) thenbegin  PostQueuedCompletionStatus(WFS.FCompletionPort, 0, 0, nil);  Temp := WFS;  WFS:=nil;  Temp.Terminate;end;end; constructor TWFS.Create(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback:
TWatchFileSystemCallback);begininherited Create(True);FreeOnTerminate:=True;FName:=IncludeTrailingBackslash(pName);FFilter:=pFilter;FSubTree:=pSubTree;FOldFileName:=EmptyStr;ZeroMemory(@FOverLapp, SizeOf(TOverLapped));FPOverLapp:=@FOverLapp;ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));FInfoCallback:=pInfoCallback;Resumeend; destructor TWFS.Destroy;beginPostQueuedCompletionStatus(FCompletionPort, 0, 0, nil);CloseHandle(FWatchHandle);FWatchHandle:=0;CloseHandle(FCompletionPort);FCompletionPort:=0;inherited Destroy;end; function TWFS.CreateDirHandle(aDir: string): THandle;beginResult:=CreateFile(PChar(aDir), FILE_LIST_DIRECTORY,
FILE_SHARE_READ+FILE_SHARE_DELETE+FILE_SHARE_WRITE,                  nil,OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0);end; procedure TWFS.Execute;beginFWatchHandle:=CreateDirHandle(FName);WatchEvent;end; procedure TWFS.HandleEvent;varFileNotifyInfo : PFileNotifyInformation;InfoCallback   : TInfoCallback;Offset         : Longint;beginPointer(FileNotifyInfo) := @FWatchBuf[0];repeat   Offset:=FileNotifyInfo^.NextEntryOffset;   InfoCallback.FAction:=FileNotifyInfo^.Action;   InfoCallback.FDrive:=FName;   SetString(InfoCallback.FNewFileName,FileNotifyInfo^.FileName,FileNotifyInfo^.FileNameLength);   InfoCallback.FNewFileName:=Trim(InfoCallback.FNewFileName);   case FileNotifyInfo^.Action of     FILE_ACTION_RENAMED_OLD_NAME:
FOldFileName:=Trim(WideCharToString(@(FileNotifyInfo^.FileName[0])));     FILE_ACTION_RENAMED_NEW_NAME: InfoCallback.FOldFileName:=FOldFileName;   end;   FInfoCallback(InfoCallback);   PChar(FileNotifyInfo):=PChar(FileNotifyInfo)+Offset;until (Offset=0) or Terminated;end; procedure TWFS.WatchEvent;varCompletionKey: Cardinal;beginFCompletionPort:=CreateIoCompletionPort(FWatchHandle, 0, Longint(pointer(self)), 0);ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));if not ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree,   FFilter, @FBytesWritte,  @FOverLapp, nil) thenbegin   raise WFSError.Create(SysErrorMessage(GetLastError));   Terminate;end elsebegin   while not Terminated do   begin     GetQueuedCompletionStatus(FCompletionPort, FNumBytes, CompletionKey, FPOverLapp, INFINITE);     if CompletionKey<>0 then     begin       Synchronize(HandleEvent);       ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));       FBytesWritte:=0;       ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree, FFilter,                            @FBytesWritte, @FOverLapp, nil);     end else Terminate;   endendend; end.    procedure MyInfoCallback(pInfo: TInfoCallback);const begin   case pInfo.FAction of          [pInfo.FDrive+pInfo.FOldFileName,pInfo.FDrive+pInfo.FNewFileName]));   else     if pInfo.FAction<FILE_ACTION_RENAMED_OLD_NAME then       Form1.Memo1.Lines.Add(Format(Action[pInfo.Faction], [pInfo.FDrive+pInfo.FNewFileName]));   end;end;  procedure TForm1.FormCreate(Sender: TObject);begin StartWatch('C:', FILE_NOTIFY_CHANGE_DIR_NAME, True, @MyInfoCallback);end; procedure TForm1.FormDestroy(Sender: TObject);beginStopWatchend;
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 6 октября 2008, 12:11
 
 |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 7 октября 2008, 20:58; участников в обсуждении: 3. 
|   | Вадим К (статус: Академик), 6 октября 2008, 11:00 [#1]:Можно. Зачечь сам процес - можно. А вот "не дать комироваться" - это уже лучше писать драйвера. А это уже не делфи...
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Ученый (статус: 8-ой класс), 6 октября 2008, 12:08 [#2]:to Вадим К. А можно поподробнее, если это вас не затрудит, please... |  
|   | Вадим К (статус: Академик), 6 октября 2008, 12:32 [#3]:to Ученый Как драйвер писать?
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Ученый (статус: 8-ой класс), 6 октября 2008, 20:06 [#4]:to  Вадим К. Как можно отследить процесс копирования файлов с жёсткого диска на какой-либо носитель информации? |  
|   | Вадим К (статус: Академик), 6 октября 2008, 20:26 [#5]:наиболее надёжно - написав драйвер. Но это не делфовская парафия. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Мережников Андрей (статус: Абитуриент), 7 октября 2008, 20:58 [#6]:Наиболее надежно - отключить в BIOS устройства со сменными носителями, порты USB и поставить суперпароль на BIOS. Но остается еще локальная сеть, WiFi, IrDA и т.д. Если серьезно, то довольно проблематичная задача, например, рассмотрим след. ситуацию : пользователь запустил Word загрузил документ, делает сохранить как... на сменный носитель - это рассматривать как копирование файла с винчестера?А если он внес в документ какие-то изменения, то как быть, ведь это уже другой файл?
 
 to Малыш - поищите лучше программку, управляющую доступом к локальным папкам. Либо не пускайте чужих за свой комп, чтобы не инфу не копировали.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |