Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 14 марта 2008, 06:35

Ответ #2. Отвечает эксперт: Drozdov D.V.

Здравствуйте, Полушин Сергей Анатольевич!
Кратко по 2 вопросу перевод строки в цифровой формат и обротно есть.
И по 1 вопросу вот вам фаил "wfsU" для работы с файлами и пример из коковата FAQ.
Пример не проверял работал просто с файлом РАБОТОСПОСОБЕН.
Вопрос помойму похожий был и есть ответ.

Удачи!

P.S. Работает NT5(2000),2003,XP
Функции по отслеживанию файлов не проверял.
FindFirstChangeNotification,
FindNextChangeNotification,
FindCloseChangeNotification вместе с WaitForSingleObject

Приложение:
  1. unit wfsU;
  2. interface
  3. type
  4.  
  5. PInfoCallback = ^TInfoCallback;
  6. TInfoCallback = record
  7.  
  8.  
  9.  
  10.  
  11. end;
  12.  
  13.  
  14. TWatchFileSystemCallback = procedure (pInfo: TInfoCallback);
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21. procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback: TWatchFileSystemCallback);
  22.  
  23. procedure StopWatch;
  24. implementation
  25. uses
  26. Classes, Windows, SysUtils;
  27. const
  28. FILE_LIST_DIRECTORY = $0001;
  29. type
  30. PFileNotifyInformation = ^TFileNotifyInformation;
  31. TFileNotifyInformation = record
  32. NextEntryOffset : DWORD;
  33. Action : DWORD;
  34. FileNameLength : DWORD;
  35. FileName : array[0..0] of WideChar;
  36. end;
  37.  
  38. WFSError = class(Exception);
  39. TWFS = class(TThread)
  40. private
  41. FName : string;
  42. FFilter : Cardinal;
  43. FSubTree : boolean;
  44. FInfoCallback : TWatchFileSystemCallback;
  45. FWatchHandle : THandle;
  46. FWatchBuf : array[0..4096] of Byte;
  47. FOverLapp : TOverlapped;
  48. FPOverLapp : POverlapped;
  49. FBytesWritte : DWORD;
  50. FCompletionPort : THandle;
  51. FNumBytes : Cardinal;
  52. FOldFileName : string;
  53. function CreateDirHandle(aDir: string): THandle;
  54. procedure WatchEvent;
  55. procedure HandleEvent;
  56. protected
  57. procedure Execute; override;
  58. public
  59. constructor Create(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback: TWatchFileSystemCallback);
  60. destructor Destroy; override;
  61. end;
  62. var
  63. WFS : TWFS;
  64. procedure StartWatch(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback: TWatchFileSystemCallback);
  65. begin
  66. WFS:=TWFS.Create(pName, pFilter, pSubTree, pInfoCallback);
  67. end;
  68. procedure StopWatch;
  69. var
  70. Temp : TWFS;
  71. begin
  72. if Assigned(WFS) then
  73. begin
  74. PostQueuedCompletionStatus(WFS.FCompletionPort, 0, 0, nil);
  75. Temp := WFS;
  76. WFS:=nil;
  77. Temp.Terminate;
  78. end;
  79. end;
  80. constructor TWFS.Create(pName: string; pFilter: cardinal; pSubTree: boolean; pInfoCallback: TWatchFileSystemCallback);
  81. begin
  82. inherited Create(True);
  83. FreeOnTerminate:=True;
  84. FName:=IncludeTrailingBackslash(pName);
  85. FFilter:=pFilter;
  86. FSubTree:=pSubTree;
  87. FOldFileName:=EmptyStr;
  88. ZeroMemory(@FOverLapp, SizeOf(TOverLapped));
  89. FPOverLapp:=@FOverLapp;
  90. ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
  91. FInfoCallback:=pInfoCallback;
  92. Resume
  93. end;
  94. destructor TWFS.Destroy;
  95. begin
  96. PostQueuedCompletionStatus(FCompletionPort, 0, 0, nil);
  97. CloseHandle(FWatchHandle);
  98. FWatchHandle:=0;
  99. CloseHandle(FCompletionPort);
  100. FCompletionPort:=0;
  101. inherited Destroy;
  102. end;
  103. function TWFS.CreateDirHandle(aDir: string): THandle;
  104. begin
  105. Result:=CreateFile(PChar(aDir), FILE_LIST_DIRECTORY, FILE_SHARE_READ+FILE_SHARE_DELETE+FILE_SHARE_WRITE,
  106. nil,OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_OVERLAPPED, 0);
  107. end;
  108. procedure TWFS.Execute;
  109. begin
  110. FWatchHandle:=CreateDirHandle(FName);
  111. WatchEvent;
  112. end;
  113. procedure TWFS.HandleEvent;
  114. var
  115. FileNotifyInfo : PFileNotifyInformation;
  116. InfoCallback : TInfoCallback;
  117. Offset : Longint;
  118. begin
  119. Pointer(FileNotifyInfo) := @FWatchBuf[0];
  120. repeat
  121. Offset:=FileNotifyInfo^.NextEntryOffset;
  122. InfoCallback.FAction:=FileNotifyInfo^.Action;
  123. InfoCallback.FDrive:=FName;
  124. SetString(InfoCallback.FNewFileName,FileNotifyInfo^.FileName,FileNotifyInfo^.FileNameLength);
  125. InfoCallback.FNewFileName:=Trim(InfoCallback.FNewFileName);
  126. case FileNotifyInfo^.Action of
  127. FILE_ACTION_RENAMED_OLD_NAME: FOldFileName:=Trim(WideCharToString(@(FileNotifyInfo^.FileName[0])));
  128. FILE_ACTION_RENAMED_NEW_NAME: InfoCallback.FOldFileName:=FOldFileName;
  129. end;
  130. FInfoCallback(InfoCallback);
  131. PChar(FileNotifyInfo):=PChar(FileNotifyInfo)+Offset;
  132. until (Offset=0) or Terminated;
  133. end;
  134. procedure TWFS.WatchEvent;
  135. var
  136. CompletionKey: Cardinal;
  137. begin
  138. FCompletionPort:=CreateIoCompletionPort(FWatchHandle, 0, Longint(pointer(self)), 0);
  139. ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
  140. if not ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree,
  141. FFilter, @FBytesWritte, @FOverLapp, nil) then
  142. begin
  143. raise WFSError.Create(SysErrorMessage(GetLastError));
  144. Terminate;
  145. end else
  146. begin
  147. while not Terminated do
  148. begin
  149. GetQueuedCompletionStatus(FCompletionPort, FNumBytes, CompletionKey, FPOverLapp, INFINITE);
  150. if CompletionKey<>0 then
  151. begin
  152. Synchronize(HandleEvent);
  153. ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
  154. FBytesWritte:=0;
  155. ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree, FFilter,
  156. @FBytesWritte, @FOverLapp, nil);
  157. end else Terminate;
  158. end
  159. end
  160. end;
  161. end.
  162. ////////////////////////-------------------
  163.  
  164. ///////////////////////--------------------
  165. unit Unit1;
  166. interface
  167. uses
  168. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  169. Dialogs, StdCtrls;
  170. type
  171. TForm1 = class(TForm)
  172. Memo1: TMemo;
  173. procedure FormCreate(Sender: TObject);
  174. procedure FormDestroy(Sender: TObject);
  175. private
  176. { Private declarations }
  177. public
  178. { Public declarations }
  179. end;
  180. var
  181. Form1: TForm1;
  182. implementation
  183. {$R *.dfm}
  184. uses wfsU;
  185. procedure MyInfoCallback(pInfo: TInfoCallback);
  186. const
  187.  
  188. begin
  189. case pInfo.FAction of
  190.  
  191. [pInfo.FDrive+pInfo.FOldFileName,pInfo.FDrive+pInfo.FNewFileName]));
  192. else
  193. if pInfo.FAction<FILE_ACTION_RENAMED_OLD_NAME then
  194. Form1.Memo1.Lines.Add(Format(Action[pInfo.Faction], [pInfo.FDrive+pInfo.FNewFileName]));
  195. end;
  196. end;
  197. procedure TForm1.FormCreate(Sender: TObject);
  198. begin
  199.  
  200. StartWatch('C:', FILE_NOTIFY_CHANGE_DIR_NAME, True, @MyInfoCallback);
  201. end;
  202. procedure TForm1.FormDestroy(Sender: TObject);
  203. begin
  204. StopWatch
  205. end;
  206. end.
  207.  
  208.  
  209.  
  210.  
  211.  


Ответ отправил: Drozdov D.V. (статус: 4-ый класс)
Время отправки: 14 марта 2008, 08:51


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:42
Выполнено за 0.04 сек.