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

Вниз

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

 
light-blr   (2008-07-01 23:56) [0]

У меня есть программа, которая вызывает вторую, та в свою очередь открывает файл и начинает что-то в него писать. Вторая программа - не моя. Может работать от нескольких секунд до нескольких минут, а первая должна ждать пока файл освободится, чтобы начать его читать. Я пробовала поставить время ожидания "с запасом", но постоянно приходится добавлять ещё, потому что время работы второй программы действительно сильно варьируется. Ну и, конечно, не хотелось бы терять лишнее время на ожидание, когда файл уже готов.
В общем, я пришла примерно к такому:

procedure WaitFile(MinSec:integer; NameFile:string);
 var f:textfile;
     s:string;
     b:boolean;
 begin
   sleep(MinSec*1000);
   b:=false;
   assignfile(f,NameFile);
   if not Fileexists(NameFile) then sleep(MinSec*1000);
   While not b do
     try
       reset(f);
       Readln(f,s);
       closefile(f);
       b:=true;
     except
       sleep(1000);
     end;
 end;

Но хотя Reset стоит в блоке try, программа иногда вылетает с ошибкой "I/O error 32". Подскажите, пожалуйста, в чём я ошиблась.


 
Loginov Dmitry ©   (2008-07-02 00:05) [1]

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


Попытаться его открыть с монопольным доступом.

Все остальное - ужаснах!


 
light-blr   (2008-07-02 00:06) [2]


> Попытаться его открыть с монопольным доступом

А поподробнее? Что-то я о таком даже не слышала... :(


 
Loginov Dmitry ©   (2008-07-02 00:10) [3]

Тут глянь
http://delphimaster.net/view/15-1212854564/

должно быть по теме


 
Loginov Dmitry ©   (2008-07-02 00:29) [4]

> А поподробнее? Что-то я о таком даже не слышала... :(


Если программа откроет файл с монопольным доступом, то никакая другая программа не сможет его прочитать. Например, файл подкачки pagefile.sys всегда открыт именно в таком вот режиме.
Функция Reset() открывает файл с монопольным доступом. Это небезопасно. Если какой-нибудь TotalCommander в момент вызова твоей прогой функции Reset вздумал обновить содержимое панелей (а он может при этом открыть каждый файл из каталога), то вызов функции Reset приведет к возникновению исключения (редко, но случается).

Вот еще по теме:

procedure WaitFile(MinSec:integer; NameFile:string);
const
 FileErrors = [ERROR_PATH_NOT_FOUND, ERROR_BUFFER_OVERFLOW,
   ERROR_DISK_FULL, ERROR_INVALID_NAME];
var
 f:textfile;
begin
 sleep(MinSec*1000);
 assignfile(f,NameFile);
 while True do
 begin
   try
     Reset(f); // при ошибке открытия попадаем в except. Файл открытым не будет.
     CloseFile(f); // файл открыли без ошибки, значит он свободен. Закрываем его.
     Exit; // дождались освобождения файла. Можно выходить.
   except
     if GetLastError in FileErrors then
       raise; // при таких ошибках бесполезно чего-либо ожидать.
     Sleep(50); // при ошибке открытия выжидаем паузу и продолжаем очередную попытку
   end;
 end;
end;


Здесь только остается молиться, чтобы после окончания ожидания та прога не вздумала снова открыть файл (ошибки ввода-вывода равновероятно посыпятся как у нее, так и из твоей проги).


 
light-blr   (2008-07-02 00:42) [5]

Спасибо огромное! Разобралась и переписала свою процедуру так, что ошибок нет, проверила. :)



Страницы: 1 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.007 c
2-1214942165
light-blr
2008-07-01 23:56
2008.08.03
Как узнать, используется ли файл другим приложением?


15-1213350730
Mystic
2008-06-13 13:52
2008.08.03
JavaScript, шахматы, перемещалка фигур, alpha


4-1193867321
Zuzlan
2007-11-01 00:48
2008.08.03
Альтернатива sleep


2-1214549615
matriza
2008-06-27 10:53
2008.08.03
преобразовать doc и xls в pdf


15-1213621467
Terr
2008-06-16 17:04
2008.08.03
Бесплатна ли программа





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