Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.21;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2008.09.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
8-1186219449
Pasha L
2007-08-04 13:24
2008.09.21
Цветовые схемы в работе с jpg (инструмент IJL)


15-1217400555
ееееееекенитен
2008-07-30 10:49
2008.09.21
помогите перевести вопрос на английский:


2-1218008748
SSSs
2008-08-06 11:45
2008.09.21
RichEdit взять кусок текста.


8-1186078843
Наташа
2007-08-02 22:20
2008.09.21
вывод графики на принтер


2-1218506684
Abcdef123
2008-08-12 06:04
2008.09.21
Проблемы перевода проекта с Delphi6 на Delphi 2007