|
Вопрос # 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
-
- uses
- Classes, Windows, SysUtils;
-
- const
- FILE_LIST_DIRECTORY = $0001;
-
- type
- PFileNotifyInformation = ^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;
-
-
- var
- WFS : TWFS;
-
- procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback:
TWatchFileSystemCallback);
- begin
- WFS:=TWFS.Create(pName, pFilter, pSubTree, pInfoCallback);
- end;
-
- procedure StopWatch;
- var
- Temp : TWFS;
- begin
- if Assigned(WFS) then
- begin
- 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);
- begin
- inherited 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;
- Resume
- end;
-
- destructor TWFS.Destroy;
- begin
- PostQueuedCompletionStatus(FCompletionPort, 0, 0, nil);
- CloseHandle(FWatchHandle);
- FWatchHandle:=0;
- CloseHandle(FCompletionPort);
- FCompletionPort:=0;
- inherited Destroy;
- end;
-
- function TWFS.CreateDirHandle(aDir: string): THandle;
- begin
- Result:=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;
- begin
- FWatchHandle:=CreateDirHandle(FName);
- WatchEvent;
- end;
-
- procedure TWFS.HandleEvent;
- var
- FileNotifyInfo : PFileNotifyInformation;
- InfoCallback : TInfoCallback;
- Offset : Longint;
- begin
- Pointer(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;
- var
- CompletionKey: Cardinal;
- begin
- FCompletionPort:=CreateIoCompletionPort(FWatchHandle, 0, Longint(pointer(self)), 0);
- ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
- if not ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree,
- FFilter, @FBytesWritte, @FOverLapp, nil) then
- begin
- raise WFSError.Create(SysErrorMessage(GetLastError));
- Terminate;
- end else
- begin
- 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;
- end
- end
- end;
-
- 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);
- begin
- StopWatch
- end;
 |
Ответ отправил: 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 Малыш - поищите лучше программку, управляющую доступом к локальным папкам. Либо не пускайте чужих за свой комп, чтобы не инфу не копировали.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|