| 
| 
 | Вопрос # 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;interfacetype PInfoCallback = ^TInfoCallback;TInfoCallback = record    end;  TWatchFileSystemCallback = procedure (pInfo: TInfoCallback);      procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback:
TWatchFileSystemCallback); procedure StopWatch;implementationusesClasses, 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.////////////////////////------------------- ///////////////////////--------------------unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)   Memo1: TMemo;   procedure FormCreate(Sender: TObject);   procedure FormDestroy(Sender: TObject);private   { Private declarations }public   { Public declarations }end;varForm1: 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);beginStopWatchend;end.     
|  | Ответ отправил: Drozdov D.V. (статус: 4-ый класс)Время отправки: 14 марта 2008, 08:51
 
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |