Текущий архив: 2005.07.11;
Скачать: CL | DM;
ВнизКак узнать, занят ли файл другим процессом? Найти похожие ветки
← →
lipskiy © (2005-05-06 12:01) [0]Собственно, сабж.
А если конкретно, то есть такая проблема. В моей программе используется компонент VCLZip22, и есть такая процедура, в которой я в один зип-архив добавляю новые файлы (по одному, по мере закачки из интернета). Иногда VCLZip22 выдает ошибку о том, что файл архива занят и он не может его открыть. На самом деле он занят моей же программой, тем же самым VCLZip22, который еще не освободил архив после упаковки в него предыдущего файла, а программный цикл уже дошел до упаковки следующего (по крайней мере я так думаю, но может это и не так). Так вот перед очередной упаковкой мне нужно проверить - свободен ли файл или нет. Подскажите, как это можно сделать.
← →
Anatoly Podgoretsky © (2005-05-06 12:04) [1]Попытаться открыть его монопольно, другого варианта нет.
← →
lipskiy © (2005-05-06 12:06) [2]А как? Код не подскажете? И чтоб эксепшен не вылез.
← →
BFG9k (2005-05-06 12:08) [3]
> Иногда VCLZip22 выдает ошибку о том, что файл архива занят
> и он не может его открыть
Это ли не проверка ? Если не записывается, значит занят.
Открыть файл одновременно для чтения и записи можно так :СreateFile(PChar(FileName),
GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
← →
BFG9k (2005-05-06 12:10) [4]
> А как? Код не подскажете? И чтоб эксепшен не вылез.
TRY ... EXCEPT ... END !!!!
← →
lipskiy © (2005-05-06 12:26) [5]
> TRY ... EXCEPT ... END !!!!
Проблема в том, что это есть в компоненте при открытии файла, стоят эти try except, да и не один. А ошибка все равно вылезает и когда не под дельфой прога запущена.
> СreateFile(PChar(FileName),
> GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,
> nil, OPEN_EXISTING,
> FILE_ATTRIBUTE_NORMAL, 0);
Хорошо, а как с учетом try except организовать цикл ожидания освобождения файла? Ведь из except end кажется нельзя делать goto. Или нужно проверять IOError?
← →
BFG9k (2005-05-06 12:44) [6]Забудь про goto раз и навсегда - его негде нельзя делать :)
Насколько я понял, ошибка в самом компоненте. Может быть он глючный и стоит использовать другой компонент для тех же целей ? Я лично в свое время пользовался ZipTV (кажется так). Не помню откуда качал, помню только что ссылку нашел на этом форуме. Поищи, может и ты найдешь.
← →
lipskiy © (2005-05-06 13:03) [7]ZipTV я тестил, и еще много других архиваторов, все кривые, в основном проблемы с кириллическими путями и с сетевыми. VCLZip22 из всех найденных оказался самым нормальным.
← →
BFG9k (2005-05-06 13:14) [8]А еще можно использовать критические секции для того, чтобы только один обработчик одновременно лез в архив. Возможно, что придется создавать новый поток каждый раз при добавлении файла.
> Хорошо, а как с учетом try except организовать цикл ожидания
> освобождения файла?
Критические секции реализуют ожидание. Пока работает один поток, остальные ждут своей очереди.
← →
lipskiy © (2005-05-06 14:19) [9]
> Критические секции
Это что за зверь такой?
А с потоками я связываться не хочу, в данном случае это только все усложнит и утяжелит неоправданно. На самый худой конец поставлю лучше задержку фиксированную на пару секунд, 100% не исключит, но вероятность снизит существенно.
Неужели же нет простого способа типа while FileBusy do Application.ProcessMessages, где FileBusy - некая функция, проверяющая занятость файла?
Вот если сделать так примерно:function FileBusy:boolean;
begin
Result:= False;
try
СreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
except
Result:= True;
end;
end;
И засунуть эту функцию в цикл while. Будет работать? Так корректно?
← →
BFG9k (2005-05-06 14:46) [10]CreateFile тебе не подойдет, так как доступ к файлам происходит с помощью сторонненого компонента.
О функции FileBusy я писал в начале - само неудачное обращение к файлу косвенно означает, что он занят. Я считаю такой подход неправильным, но все же попробуй следующее:
function FileBusy(...):boolean;
var F:THandle;
begin
F:=CreateFile(...);
Result:=F=INVALID_HANDLE_VALUE;
if not Result then
CloseHandle(F);
end;
← →
alex_*** (2005-05-06 15:43) [11]а не проще не держать открытым архив а открывать только для записи и после сразу прикрывать?
← →
Erik1 © (2005-05-09 10:57) [12]В любом более мение нормальном компоненте есть оповещение об оканчании упаковки. Да и самому можно подождать пока упаковка невернет управление. К томуже неясно как ты в одном потоке умудряешся запаковывать новый фаил до возврата упаравления. Думаю ошибка у тебя восем в другом, код в студию!
← →
Gero © (2005-05-09 11:00) [13]
> ZipTV
Он стоит 100$.
← →
woodoo (2005-05-10 14:08) [14]
> BFG9k (06.05.05 12:44) [6]
> Забудь про goto раз и навсегда - его негде нельзя делать
Ух ты как категорично...
← →
SammIk © (2005-05-11 10:25) [15]2 Anatoli
Есть вариант, тем более что этоНТ система.
Прослистать все хендлы, сравниывая имя, находишь свой фаил.
Смотришь кто держит фаил.
Но в жанном случае, лучше конечно открыть монопольно фаил.
← →
Fay © (2005-05-11 13:45) [16]2 BFG9k (06.05.05 12:44) [6]
> Забудь про goto раз и навсегда - его негде нельзя делать :)/I>
Бред
← →
Floppy © (2005-05-11 15:41) [17]Так видимо все-таки будет правильней:
function FileStatus(Const Origin: string): boolean;
var
F: TFileStream;
begin
try
F := TFileStream.Create(Origin, fmOpenReadWrite OR fmShareExclusive);
try
Result := true;
finally
F.Free;
end;
except
Result := false;
end;
end
Ну, а для поного счастья
fmOpenRead Open the file for reading only.
fmOpenWrite Open the file for writing only. Writing to the file completely replaces the current contents.
fmOpenReadWrite Open the file to modify the current contents rather than replace them.
The share mode must be one of the following values:
Value Meaning
fmShareCompat Sharing is compatible with the way FCBs are opened.
fmShareExclusive Other applications can not open the file for any reason.
fmShareDenyWrite Other applications can open the file for reading but not for writing.
fmShareDenyRead Other applications can open the file for writing but not for reading.
fmShareDenyNone No attempt is made to prevent other applications from reading from or writing to the file
← →
Fay © (2005-05-11 17:17) [18]Floppy © (11.05.05 15:41) [17]
Мне кажется, Вы ошиблись форумом. Приведённый код не имеет отношения к API.
← →
Floppy © (2005-05-11 17:36) [19]> Fay © (11.05.05 17:17) [18]
Вы, правы, убедили :(
← →
Floppy © (2005-05-11 17:37) [20]> Fay © (11.05.05 17:17) [18]
Вы, правы, убедили :(
Страницы: 1 вся ветка
Текущий архив: 2005.07.11;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.039 c