|
Вопрос # 1 412/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
У меня к вам несколько вопросов:
1) как узнать вот что: открыт ли некий файл какими-нибудь программами? Если да, то в каком режиме(запись/чтение)?
2)есть строка с буквами и цифрами. Нужно преобразовать ее в число (до первой буквы или же до последней цифры). Есть стандартные функции для этой цели?
P.s. Delphi 7
По второму вопросу: функцию не пишите - сам уже давно написал. Просто охото узнать есть ли стандартные подходящие мне функции.
Заранее спасибо. С огромным уважением и благодарностью к сайту, программистам и Ерёмину А.А.
 |
Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 13 марта 2008, 21:32
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович
Здравствуйте, Полушин Сергей Анатольевич!
По-поводу первого вопроса: проверить можно с помощью Process Explorer от Марка Руссиновича (www.sysinternals.com), там есть пунктик Find -> Find Handle...
Эта утилита использует драйвер и перечисляет не только Handle типа File но и вообще все. Можно попробовать и без драйвера - смотрите мой пример в разделе Исходники (File Unfreezer), только там есть несколько тонкостей, некоторые структуры в XP отличаются от тех, что в NT.
Ответ #2. Отвечает эксперт: Drozdov D.V.
Здравствуйте, Полушин Сергей Анатольевич!
Кратко по 2 вопросу перевод строки в цифровой формат и обротно есть.
И по 1 вопросу вот вам фаил "wfsU" для работы с файлами и пример из коковата FAQ.
Пример не проверял работал просто с файлом РАБОТОСПОСОБЕН.
Вопрос помойму похожий был и есть ответ.
Удачи!
P.S. Работает NT5(2000),2003,XP
Функции по отслеживанию файлов не проверял.
FindFirstChangeNotification,
FindNextChangeNotification,
FindCloseChangeNotification вместе с WaitForSingleObject
Приложение: Переключить в обычный режим- 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.
- ////////////////////////-------------------
-
- ///////////////////////--------------------
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls;
- type
- TForm1 = class(TForm)
- Memo1: TMemo;
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- uses wfsU;
- 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;
- end.
-
-
-
-
-
 |
Ответ отправил: Drozdov D.V. (статус: 4-ый класс)
Время отправки: 14 марта 2008, 08:51
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|