Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать, занят ли файл каким-нибудь приложением? [D5, Win95/98, Win2k]


Брат ©   (2002-11-07 12:14:00) 

В программе происходит архивация файлов. Если файл инфицирован, его на время занимает Антивирус Касперского, поэтому Winrar матерится, что не может заархивировать файл... Как узнать, занят ли файл?


Alex4444444444   (2002-11-07 16:50:00) [1]

Nu, ne znayu... Poprobujte, v kachestve debugging"a, porabotat" s ODNIM etim concretnym file"om. Chto, Vy otkryt" mozhete, a WinRar net? K stati, ya ne dumayu, chto WinRAR"u oni nuzhny dlya zapisi, hotya, kto znaet... Eshe, FileOpen(.., fmOpenWrite) mozhet vydavat" oshibku prosto potomu, chto file readonly (hotya ya i ne uveren).


Брат   (2002-11-07 15:45:00) [2]


> Маленькое дополнение - открывать файл нужно для записи.
> Для чтения он может быть доступен и Касперскому и Вам. Хотя,
> я могу и заблуждаться.

все верно. Открываю так - FileOpen(SR.Name,fmOpenWrite);


Геннадий   (2002-11-07 15:41:00) [3]

Маленькое дополнение - открывать файл нужно для записи. Для чтения он может быть доступен и Касперскому и Вам. Хотя, я могу и заблуждаться.


Брат   (2002-11-07 15:30:00) [4]

Спасибо, брат. Я заметил эту ошибку... Все равно ничо не получается. :-((
И ваш код встроил - все равно WinRar Выдает ошибку, что не удается найти файл....Хотя он есть...


Alex4444444444   (2002-11-07 14:57:00) [5]

Da, sluchayno zametil BOL"SHUYU oshibku u Vas:
FileClose nuzhno peredavat" Handle, vozvrashennyj PERVOY FileOpen!


Alex4444444444   (2002-11-07 14:56:00) [6]

(1) FindClose;
(2) Nu, togda nado Sleep, potom scanirovat" (recursivno), i tak v cycle, s vyhodom kogda vse OK. Chto-to typa


function HasLockedFile(const Path: string): Boolean;
procedure FindLockedFile(const Path: string);
var Res: Integer;
SR: TSearchRec;
Handle: Integer;
begin
Res := FindFirst(...);
Result := False;
try
while Res = 0 do begin
if {is folder } then begin
if (SR.Name <> ".") and (SR.Name <> "..") then
FindLockedFile();
end
else begin
Handle = FileOpen(SR.Name, ...);
if Handle <= 0 then
raise TException.Create("")
else FileClose(Handle);
end;
Res := FindNext(SR);
end;
finally
FindClose(SR);
end;
end;
begin
Result := False;
try
FindLockedFile(Path);
except
Result := True;
end;
end;

repeat
Sleep(1000);
until not HasLockedFile(MyDir);



Sm. takzhe (3)--(5)


Брат   (2002-11-07 14:28:00) [7]


> Da, chto ne poluchaetsya?
> Para zamechanij:
> (1) netu FindClose;
> (2) esli ya pravil"no ponyal, Vam nuzhno znat", EST"li nedostupnye
> files ili net. Togda luchshe

Добавил FileClose - все равно не работает...
Цель моей программы: как известно, Касперский в архивах не лечит. Поэтому я розархивирую файлы из архива во временную папочку. При этом, если файл(ы) инфицирован, Касперский его на время занимает и лечит. Затем я вылеченные файлы заархивирую обратно. Так вот, мне нужно сделать задержку перед архивированием. Это я и пытаюсь сделать процедурой, которую я описал выше... Но не получается...


Брат   (2002-11-07 14:23:00) [8]


> А что не получается? Правда если доступа к файлу нет, то
> у вас будет бесконечный цикл.

Всё верно. Я выхожу из цикла когда ко всем файлам в папке доступ есть.


Alex4444444444   (2002-11-07 13:47:00) [9]

Da, chto ne poluchaetsya?
Para zamechanij:
(1) netu FindClose;
(2) esli ya pravil"no ponyal, Vam nuzhno znat", EST"li nedostupnye files ili net. Togda luchshe

if FileOpen(...) = -1 then begin
Error := True;
Exit; // or Break
end;

(3) Vy ne proveryaete, yavlyaetsya li file catalogom (kotoryj, konechno, otkryt" nel"zya);
(4) Navernoe, catalogi nuzhno skanirovat" recursivno (ne zabyv proverit" na "." i ".." !)
(5) Eto delo vkusa, no ya obychno pishu tak (chtoby real"nuyu rabotu s najdennym file"om delat" odin raz):


var Res: Integer;
Res := FindFirst(...);
while Res = 0 do begin
// Do whatever you need to do with the file
Res := FindNext(SR);
end;
FindClose(SR);


KoluChi   (2002-11-07 13:23:00) [10]

А что не получается? Правда если доступа к файлу нет, то у вас будет бесконечный цикл.


Брат   (2002-11-07 12:57:00) [11]

хотя в пошаговом режиме работает......


Брат   (2002-11-07 12:54:00) [12]

Что-то не получается.... может ошибка какая-нибудь?
....
procedure TfrmMain.Copying(Dir1: String);
var SR : TSearchRec;
er : Byte;
begin
while er>0 do
begin
er:=0;
if FindFirst(Dir1+"\*.*",faAnyFile,SR)=0 then
begin
if fileopen(Dir1+"\"+SR.Name,fmOpenRead)=-1
then
er:=er+1
else
fileclose(fileopen(Dir1+"\"+SR.Name,fmOpenRead));
while FindNext(SR)=0 do
begin
if fileopen(Dir1+"\"+SR.Name,fmOpenRead)=-1
then
er:=er+1
else
fileclose(fileopen(Dir1+"\"+SR.Name,fmOpenRead));
end;
end;
end;
end;
....


Брат   (2002-11-07 12:31:00) [13]

спасибо... буду пробовать ;-)
если получится - скажу


Alex4444444444   (2002-11-07 12:28:00) [14]

Tol"ko ne zapud"te srazu zakryt"!


Брат   (2002-11-07 12:27:00) [15]

ща попробую....


Alex4444444444   (2002-11-07 12:23:00) [16]

FileOpen


Брат   (2002-11-07 12:20:00) [17]


> Poprobovat" ego otkryt"?

чем?


Alex4444444444   (2002-11-07 12:18:00) [18]

Poprobovat" ego otkryt"?


Наверх

Титульная страница Поиск, карта сайта Написать письмо