![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как грамотно проверить файл на возможность его открытия [D7, WinXP]
/glokk © (2004-09-02 10:21:00)Уважаемые мастера, подскажите как грамотно проверить файл на возможность его открытия.
Ситуация такая - есть DBF-файл на сетевом диске, который переодически обновляется операторами.
необходимо перед вызовом BatchMove.Execute (чтобы слить свежую версию себе) проверить, не открыт ли он в данный момент, и вообще свободен ли...
Заранее спасибо
Fay (2004-09-02 22:06:00) [1]2 clickmaker © (02.09.04 11:09) [4]
А не судьба?
res := CreateFile(FileName, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
free := res <> INVALID_HANDLE_VALUE;
Anatoly Podgoretsky (2004-09-02 19:30:00) [2]/glokk (02.09.04 11:59) [6]
Т.е. я звоню оператору, говорю - "сбрось мне последние данные". У них база на FoxPro 2.5.(DOS) - они сбрасывают.
Далее оператор говормт сбросил и ты выполняешь свою работу, иначе тебе ничего не поможет.
Reindeer Moss Eater (2004-09-02 17:29:00) [3]Открытость/неоткрытость файла ВО ВРЕМЯ ПРОВЕРКИ это не одно и то же что открытость/неоткрытость файла во время импорта данных.
Это все равно как сходить без кошелька в магазин, что бы убедиться что там есть пиво.
Потом вернуться за деньгами и идти покупать то пиво.
А его уже и след простыл.
KSergey (2004-09-02 17:23:00) [4]> /glokk (02.09.04 13:00) [14]
> подразумевается открытие КАК ТАБЛИЦА БД или КАК ФАЙЛ...
Я чета не понял на кого был наезд в этом посте, ну да ладно.
Ответ на вопрос есть в посте [12], последняя строка
oldman (2004-09-02 17:01:00) [5]
> /glokk
"Файл, открытый КАК ФАЙЛ" - перевели...
Skyle (2004-09-02 13:08:00) [6]
> [14] /glokk (02.09.04 13:00)
Для KSergey © , также как и для файловой системы, абсолютно сиренево, что это за файл. Бывают файлы, просто файлы...
/glokk (2004-09-02 13:00:00) [7]Уважаемый KSergey. Спасибо - я понял ваш дельный комментарий (в отличие от другого человека, который выбрал себе очень подходящий ник...). Только давайте окончательно - в вашем:
"чтение и открытие файла в режиме чтения не мешает никому."
подразумевается открытие КАК ТАБЛИЦА БД или КАК ФАЙЛ...
Алхимик (2004-09-02 12:33:00) [8]
> Т.е. я звоню оператору, говорю - "сбрось мне последние данные".
> У них база на FoxPro 2.5.(DOS) - они сбрасывают
И добавляешь:
"А потом пускани мою утилиту MyImportData.exe"
KSergey (2004-09-02 12:32:00) [9]> [10] /glokk (02.09.04 12:28)
> Да, кстати - проверка даты файла тоже в похожем режиме должна
> производиться. Тоже чтоб не помешала.
Еще раз: чтение и открытие файла в режиме чтения не мешает никому. Ну кроме как открытие эксклюзивное - оно, понятно, не даст кому-либо еще открыть файл.
> Вообще, как все это себя ведет.... в то время когда файл
> DBF открыт как таблица базы данных к ней обращаются как
> к обычному файлу на предмет считывания даты.
Для файловой системы нет различия открыт файл как таблица БД или как-то еще. Для нее все файлы равны ;)
KSergey (2004-09-02 12:30:00) [10]Она и не помешает
Она вообще ему не помешает в любом случае, если только в файл не будет производиться запись
А уж неудачная попытка открытия - точно е помешает.
isDone := FALSE; { Boolean }
while NOT isDone do
try
BatchMove;
isDone := TRUE;
except
end;
> Я думаю поставить проверку в Application.OnIdle...
Сто раз же сказано: НЕ НАДО ПРОВЕРОК!!!
Надо брать - и делать.
/glokk (2004-09-02 12:28:00) [11]Да, кстати - проверка даты файла тоже в похожем режиме должна производиться. Тоже чтоб не помешала.
Вообще, как все это себя ведет.... в то время когда файл DBF открыт как таблица базы данных к ней обращаются как к обычному файлу на предмет считывания даты. Моих знаний не хватает чтобы ответить на этот вопрос, поэтому я к Вам и обратился
/glokk (2004-09-02 12:24:00) [12]так давайте точки над е:
не надо открывать как таблицу БД. т.е. не надо TTable.Open. Я это имею в виду.
ну а файл есс-но открывать надо (но как файл). Так вот и вопрос - как это грамотно сделать. Причем так, чтобы в случае если проверка будет выполняться во время "сбрасывания данных" она не помешала этому важному процессу.
try
open -> ???
except
finally
end;
P.S.
Я думаю поставить проверку в Application.OnIdle...
KSergey (2004-09-02 12:13:00) [13]В FoxPro открывать в эксклюзивном режиме (у либо у себя пытаться эксклюзивно)
А вот это
> [6] /glokk (02.09.04 11:59)
> чтобы сделать BatchMove не обязятально открывать файл.
я вовсе не понял
Как это "не над открывать"??? Может и не явно, но файл в любом случае открывается, когда происходит чтение.
А потому читай Reindeer Moss Eater - он верно пишет.
clickmaker (2004-09-02 12:12:00) [14]
> Из всего следует - мне не надо открывать файл, мне надо
> лишь проверить, можно ли его открыть.
Это можно сделать, только открыв его
Или написать драйвер файловой системы режима ядра. Тебе оно надо?
/glokk (2004-09-02 11:59:00) [15]Ну, так:
try open - except - finally не подходит так как для того чтобы сделать BatchMove не обязятально открывать файл.
Далее, я для упрощения написал что файл обновляется операторами, на самом деле есть тонкость. Данные в DBF "сбрасываются" единовременно. Т.е. я звоню оператору, говорю - "сбрось мне последние данные". У них база на FoxPro 2.5.(DOS) - они сбрасывают. Далее мне надо "залить" это к себе и импортировать в Firebird. (Вся эта катавасия из-за того что я не хочу работать в FoxPro2.5)
Ну так вот, я пишу программу которая будет автоматически отлавливать этот момент "завершения сбрасывания данных" и перекачивать себе.
Строю ее так:
1. проверка даты DBF-файла на сервере и сравнение его с датой прошлого файла
2. если даты различны, т.е. на сервере позже - то BathMove к себе (для скорости), ну а потом от себя уже в FB.
ну так вот, в п.п. 2 мне надо поставить проверку, свободен ли файл, т.е. закончно ли сбрасывание (оно длится около 30 сек и если в этот момент запуститься BatchMove, то я боюсь FoxPro этого не поймет).
Из всего следует - мне не надо открывать файл, мне надо лишь проверить, можно ли его открыть. Причем открыть не как файл БД, а как обычный файл. Иначе говоря - убедиться что в данный момент файл не используется. Цель - чтобы BatchMove запускался гарантированно после финала работы FoxPro... мать ее
Reindeer Moss Eater (2004-09-02 11:14:00) [16]необходимо перед вызовом BatchMove.Execute (чтобы слить свежую версию себе) проверить, не открыт ли он в данный момент, и вообще свободен ли...
А кто сказал, что после выполнения проверочного кода файл останется в таком же состоянии?
Не нужен никакой код проверки потому что он не отвечает на поставленный вопрос.
clickmaker (2004-09-02 11:09:00) [17]res := CreateFile(FileName, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
if not res and (GetLastError = ERROR_SHARING_VIOLATION) then free := false;
Drakosha (2004-09-02 11:06:00) [18]free:=true;
try
open
exept
free:=false
finally
closefile
типа того :)
Reindeer Moss Eater (2004-09-02 10:30:00) [19]Открыть его.
Reindeer Moss Eater (2004-09-02 10:30:00) [20]Иначе будет безграмотно.