Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Как узнать, занят ли файл другим процессом?   Найти похожие ветки 

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

Форум: "WinAPI";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.048 c
11-1101855353
Алексей
2004-12-01 01:55
2005.07.11
Уважаемый Владимир Кладов...


3-1117001327
ANB
2005-05-25 10:08
2005.07.11
Как скопировать таблицу из схемы в схему (Oracle)


4-1116013371
Kolan
2005-05-13 23:42
2005.07.11
Как получить Handle активного edit а (не моего).


14-1118828872
emfw
2005-06-15 13:47
2005.07.11
Вопросы


1-1118749464
GEEK
2005-06-14 15:44
2005.07.11
В чем ошибка? Можно ли сравнить две TPoint?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский