Форум: "WinAPI";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
ВнизОтлов подключения флешки и залива туда инфы Найти похожие ветки
← →
Сергей Ю. (2006-02-02 09:03) [0]Подскажите где взять пример для отлова подключения флешки? И как узнать сколько туда заливается инфы. Надо сделать прогу по контролю за юзерами.
← →
kaZaNoVa © (2006-02-02 09:09) [1]отлов ... можно обновлять список доступных дисков по таймеру и следить за файлами на флешке ...
← →
Сергей Ю. (2006-02-02 09:24) [2]Надо за каждый кб залитый на флешку поиметь с клиента бабосы. Тут надо ТОЧНО до кб знать сколько он туда себе залил. Придется тоды раз в секунду это делать, а у меня проге и так задач хватает :)
Да и хоца както красиво это сделать :)
← →
kaZaNoVa © (2006-02-02 09:31) [3]Сергей Ю. (02.02.06 9:24) [2]
поиметь с клиента бабосы.
крута :))))
но он наверное может заливать через разные проги .. боюсь надо чё-то уровня драйвера флешки ..
← →
TUser © (2006-02-02 10:00) [4]ReadDirectoryChangesW
← →
Сергей Ю. (2006-02-02 10:02) [5]А поподробнее где про "ReadDirectoryChangesW" узнать?
← →
Игорь Шевченко © (2006-02-02 10:10) [6]
> А поподробнее где про "ReadDirectoryChangesW" узнать?
http://msdn.microsoft.com
← →
Сергей Ю. (2006-02-02 12:09) [7]:) юмор оценил
а если пример где подсмотреть?
← →
Gero © (2006-02-02 12:12) [8]> Сергей Ю. (02.02.06 12:09)
> :) юмор оценил
В каком месте? Скажи, может и я посмеюсь.
← →
kaZaNoVa © (2006-02-02 12:20) [9]Сергей Ю. (02.02.06 12:09) [7]
а если пример где подсмотреть?Игорь Шевченко © (07.10.04 14:27) [1]
unit FolderMonitorThread;
interface
uses
Windows, Classes;
type
TOnNewFileEvent = procedure (const FileName: string) of object;
TOnErrorEvent = procedure (const ErrMsg: string) of object;
TMonitorThread = class(TThread)
private
FEventsToWait: array[0..1] of THandle;
FDirectoryHandle: THandle;
FOverlapped: OVERLAPPED;
FBuffer: PChar;
FOnNewFile: TOnNewFileEvent;
FOnError: TOnErrorEvent;
protected
procedure Execute; override;
procedure DoOnNewFile (const FileName: string); dynamic;
procedure DoOnError (const ErrMsg: string); dynamic;
public
constructor Create (AStopEvent, ADirectoryHandle: THandle);
destructor Destroy; override;
property OnNewFile: TOnNewFileEvent read FOnNewFile write FOnNewFile;
property OnError: TOnErrorEvent read FOnError write FOnError;
end;
implementation
uses
SysUtils, FolderMonitorConsts, CommonConsts;
const
FOLDER_MONITOR_BUFFER_SIZE = 65530;
procedure ParseNotificationBuffer (Buffer: PChar; AFiles: TStrings);
var
PEntry: PFILE_NOTIFY_INFORMATION;
MoreEntries: Boolean;
begin
AFiles.Clear;
PEntry := PFILE_NOTIFY_INFORMATION(Buffer);
MoreEntries := true;
while MoreEntries do begin
if PEntry^.NextEntryOffset = 0 then
MoreEntries := false;
if PEntry^.Action = FILE_ACTION_ADDED then
AFiles.Add(WideCharLenToString(PEntry^.FileName,
PEntry^.FileNameLength div SizeOf(WideChar)));
PEntry := PFILE_NOTIFY_INFORMATION(PChar(PEntry) + PEntry^.NextEntryOffset);
end;
end;
{ TMonitorThread }
constructor TMonitorThread.Create(AStopEvent, ADirectoryHandle: THandle);
begin
inherited Create(true);
FEventsToWait[0] := AStopEvent;
FEventsToWait[1] := CreateEvent(nil, true, false, nil);
FOverlapped.hEvent := FEventsToWait[1];
FDirectoryHandle := ADirectoryHandle;
FBuffer := AllocMem(FOLDER_MONITOR_BUFFER_SIZE);
if not Assigned(FBuffer) then
SetEvent(AStopEvent);
end;
destructor TMonitorThread.Destroy;
begin
CloseHandle(FEventsToWait[1]);
if Assigned(FBuffer) then begin
FreeMem (FBuffer);
FBuffer := nil;
end;
inherited;
end;
procedure TMonitorThread.DoOnError(const ErrMsg: string);
begin
if Assigned(FOnError) then
FOnError(ErrMsg);
end;
procedure TMonitorThread.DoOnNewFile (const FileName: string);
begin
if Assigned(FOnNewFile) then
FOnNewFile(FileName);
end;
procedure TMonitorThread.Execute;
var
BytesRead: DWORD;
WaitResult: DWORD;
Files: TStringList;
I: Integer;
begin
//Не убили ли нас еще при рождении ?
if WaitForSingleObject(FEventsToWait[0], 1) <> WAIT_TIMEOUT then
Exit;
while not Terminated do begin
if not ReadDirectoryChangesW (FDirectoryHandle, FBuffer,
FOLDER_MONITOR_BUFFER_SIZE, false, FILE_NOTIFY_CHANGE_FILE_NAME,
@BytesRead, @FOverlapped, nil) then begin
DoOnError(SysErrorMessage(GetLastError));
Terminate;
Break; //Невозможно поставить запрос наблюдения каталога в очередь
end;
WaitResult := WaitForMultipleObjects(2, @FEventsToWait, false, INFINITE);
if WaitResult = WAIT_OBJECT_0 then begin
Terminate;
Break; //Получен внешний запрос на окончание наблюдения
end else if WaitResult <> WAIT_OBJECT_0+1 then begin
DoOnError(SysErrorMessage(GetLastError));
Terminate;
Break; //Неизвестная ошибка
end else begin
//Закончилась операция чтения изменений в каталоге
if not GetOverlappedResult (FDirectoryHandle, FOverlapped, BytesRead,
false) then begin
DoOnError(SysErrorMessage(GetLastError));
Terminate;
Break; //Неизвестная ошибка при попытке получения результата окончания
//асинхронной операции ввода-вывода
end;
// Сейчас в буфере находится BytesRead байт информации об изменениях в
// каталоге
Files := TStringList.Create;
try
ParseNotificationBuffer (FBuffer, Files);
for I:=0 to Pred(Files.Count) do
DoOnNewFile(Files[I]);
finally
Files.Free;
end;
end;
end;
end;
end.
← →
kaZaNoVa © (2006-02-02 12:22) [10]там еще дополнения были:
type
FILE_NOTIFY_INFORMATION = packed record
NextEntryOffset: DWORD;
Action: DWORD;
FileNameLength: DWORD;
FileName: array[0..0] of WideChar;
end;
PFILE_NOTIFY_INFORMATION = ^FILE_NOTIFY_INFORMATION;
← →
Сергей Ю. (2006-02-02 12:33) [11]Вот спасибо, буду разбираться что тут и где.
P.S. Юмор - посыл меня на http://msdn.microsoft.com. Былоб куча времени обязятельно все изучил, но это для меня непрофильная задача и времени в обрез.
Еще раз спасибо за пример.
← →
Игорь Шевченко © (2006-02-02 12:46) [12]
> но это для меня непрофильная задача и времени в обрез.
Вообще-то это твои проблемы, не так ли ? У отвечающих таких непрофильных задач не стоит
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.013 c