Форум: "WinAPI";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];
ВнизEFOpenError Процесс не может получить доступ к файлу Найти похожие ветки
← →
GanibalLector © (2007-12-05 02:01) [0]Имеем следующую ситуацию :
поток следит за определенным каталогом на факт создания, удаления файлов.
Следит через FindFirstChangeNotification (ибо в win98 юзаю).
После факта создания, вызываю FindFirst,FindClose,FindClose чтобы "поиметь" имя файла.
Далее, пытаюсь открыть этот файл.
Вот и получается, что файл не успел скопироваться, а я уже его пытаюсь использовать.
Получаю ошибку EFOpenError Процесс не может получить доступ к файлу, т.к. этот файл занят другим процессом.
Есть конечно вариант сделать небольшую задержку, при этом все заработает. Но все же есть желание сделать по правильному. Но как ?
Код :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button2: TButton;
Button3: TButton;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FEvent:THandle;
{ Private declarations }
public
procedure StartScanFiles;
procedure StopScanFiles;
{ Public declarations }
end;
type
TThreadParam=packed record
hEv:THandle;
hLine:PAnsiChar;
end;
PThreadParam=^TThreadParam;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure __OpenFile(hFileName:String);
var List:TStringList;
begin
if not FileExists(hFileName) then Exit;
List:=TStringList.Create;
try
List.LoadFromFile(hFileName);
if List.Count>0 then // ошибка !!! EFOpenError
Windows.Beep(800,40);
finally
List.Free;
end;
end;
function ThreadFunc(Param:PThreadParam):DWord;
var Signaled:DWord;
hEvents:array[0..1] of THandle;
hEvent:THandle;
F:TSearchRec;
hExit:Boolean;
begin
hExit:=False;
hEvent:=FindFirstChangeNotification(
Param.hLine, // Проверяемый каталог
False, // Подкаталоги не проверяются
FILE_NOTIFY_CHANGE_FILE_NAME);
// if hEvent<>INVALID_HANDLE_VALUE then ;
hEvents[0]:=hEvent;
hEvents[1]:=Param.hEv;
try
repeat
Signaled:=WaitForMultipleObjects(2,@hEvents,False,INFINITE);
case Signaled of
WAIT_OBJECT_0:
begin
FindFirst(IncludeTrailingPathDelimiter(Param.hLine)+"*.txt", faAnyFile, F);
try
repeat
//Sleep(100); // так работает
__OpenFile(IncludeTrailingPathDelimiter(Param.hLine)+F.Name);
until FindNext(F) <> 0;
finally
FindClose(F);
end;
FindNextChangeNotification(hEvent);
end;
WAIT_OBJECT_0+1:hExit:=True;
end;
until hExit=True;
finally
FindCloseChangeNotification(hEvent);
end;
Dispose(Param);
Result:=0;
end;
procedure TForm1.StartScanFiles;
var ThreadID:DWord;
R:PThreadParam;
begin
ResetEvent(FEvent);
New(R);
R^.hEv:=FEvent;
R^.hLine:="C:\Temp\1";
CloseHandle(BeginThread(nil,0,@ThreadFunc,R,0,ThreadID));
end;
procedure TForm1.StopScanFiles;
begin
SetEvent(FEvent);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
StartScanFiles;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
StopScanFiles;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FEvent:=CreateEvent(nil,True,True,nil);
end;
end.
Заранее спасибо !!!
← →
Rouse_ © (2007-12-05 10:53) [1]Попробуй встать на FILE_NOTIFY_CHANGE_LAST_WRITE
← →
GanibalLector © (2007-12-05 14:06) [2]2 Rouse_ © (05.12.07 10:53) [1]
Попробовал. Нотификация FILE_NOTIFY_CHANGE_LAST_WRITE приходит 3 раза при создании файла размером в несколько байт.
Также нашел http://www.sql.ru/forum/actualthread.aspx?tid=490302
судя по всему, прийдется делать попытку получения экскл. доступа.
:(
← →
slow!alfamoon!com (2007-12-08 04:57) [3]тебе надо получить имя файла по его хэндлу, я правильно понял?
← →
GanibalLector © (2007-12-08 19:11) [4]нет. не правильно ты понял.
что, трудно прочитать [0] ?
← →
Leonid Troyanovsky © (2007-12-09 12:10) [5]
> GanibalLector © (05.12.07 14:06) [2]
> Попробовал. Нотификация FILE_NOTIFY_CHANGE_LAST_WRITE приходит
> 3 раза при создании файла размером в несколько байт.
IMHO, следует задать некий интервал времени и, если он
истек после LAST_WRITE, то открывать файл монопольно.
Кста, FileExists - лишнее.
Да и, во-ще, бесполезная функция.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2008.09.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c