Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.007 c
15-1217697438
@!!ex
2008-08-02 21:17
2008.09.21
BSOD BSOD BSOD


2-1218043525
MaryM
2008-08-06 21:25
2008.09.21
Проверка орфографии в delphi 2007


15-1217453643
flaxe
2008-07-31 01:34
2008.09.21
Описание Программы


2-1218115988
Дамир
2008-08-07 17:33
2008.09.21
Работа с окнами


6-1193081297
Ezik
2007-10-22 23:28
2008.09.21
Удаленное выключение ПК





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский