![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать, занят ли файл каким-нибудь приложением? [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"?