Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.19;
Скачать: CL | DM;

Вниз

как грамотно проверить файл на возможность его открытия   Найти похожие ветки 

 
/glokk   (2004-09-02 10:21) [0]

Уважаемые мастера, подскажите как грамотно проверить файл на возможность его открытия.

Ситуация такая - есть DBF-файл на сетевом диске, который переодически обновляется операторами.
необходимо перед вызовом BatchMove.Execute (чтобы слить свежую версию себе) проверить, не открыт ли он в данный момент, и вообще свободен ли...

Заранее спасибо


 
Reindeer Moss Eater ©   (2004-09-02 10:30) [1]

Открыть его.


 
Reindeer Moss Eater ©   (2004-09-02 10:30) [2]

Иначе будет безграмотно.


 
Drakosha   (2004-09-02 11:06) [3]

free:=true;
try
 open
exept
 free:=false
finally
closefile

типа того :)


 
clickmaker ©   (2004-09-02 11:09) [4]

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;


 
Reindeer Moss Eater ©   (2004-09-02 11:14) [5]

необходимо перед вызовом BatchMove.Execute (чтобы слить свежую версию себе) проверить, не открыт ли он в данный момент, и вообще свободен ли...

А кто сказал, что после выполнения проверочного кода файл останется в таком же состоянии?

Не нужен никакой код проверки потому что он не отвечает на поставленный вопрос.


 
/glokk   (2004-09-02 11:59) [6]

Ну, так:
try open - except - finally не подходит так как для того чтобы сделать BatchMove не обязятально открывать файл.

Далее, я для упрощения написал что файл обновляется операторами, на самом деле есть тонкость. Данные в DBF "сбрасываются" единовременно. Т.е. я звоню оператору, говорю - "сбрось мне последние данные". У них база на FoxPro 2.5.(DOS) - они сбрасывают. Далее мне надо "залить" это к себе и импортировать в Firebird. (Вся эта катавасия из-за того что я не хочу работать в FoxPro2.5)

Ну так вот, я пишу программу которая будет автоматически отлавливать этот момент "завершения сбрасывания данных" и перекачивать себе.
Строю ее так:
1. проверка даты DBF-файла на сервере и сравнение его с датой прошлого файла
2. если даты различны, т.е. на сервере позже - то BathMove к себе (для скорости), ну а потом от себя уже в FB.

ну так вот, в п.п. 2 мне надо поставить проверку, свободен ли файл, т.е. закончно ли сбрасывание (оно длится около 30 сек и если в этот момент запуститься BatchMove, то я боюсь FoxPro этого не поймет).

Из всего следует - мне не надо открывать файл, мне надо лишь проверить, можно ли его открыть. Причем открыть не как файл БД, а как обычный файл. Иначе говоря - убедиться что в данный момент файл не используется. Цель - чтобы BatchMove запускался гарантированно после финала работы FoxPro... мать ее


 
clickmaker ©   (2004-09-02 12:12) [7]


> Из всего следует - мне не надо открывать файл, мне надо
> лишь проверить, можно ли его открыть.

Это можно сделать, только открыв его
Или написать драйвер файловой системы режима ядра. Тебе оно надо?


 
KSergey ©   (2004-09-02 12:13) [8]

В FoxPro открывать в эксклюзивном режиме (у либо у себя пытаться эксклюзивно)

А вот это

> [6] /glokk   (02.09.04 11:59)
> чтобы сделать BatchMove не обязятально открывать файл.

я вовсе не понял
Как это "не над открывать"??? Может и не явно, но файл в любом случае открывается, когда происходит чтение.
А потому читай Reindeer Moss Eater - он верно пишет.


 
/glokk   (2004-09-02 12:24) [9]

так давайте точки над е:
не надо открывать как таблицу БД. т.е. не надо TTable.Open. Я это имею в виду.
ну а файл есс-но открывать надо (но как файл). Так вот и вопрос - как это грамотно сделать. Причем так, чтобы в случае если проверка будет выполняться во время "сбрасывания данных" она не помешала этому важному процессу.
try
 open -> ???  
except
finally
end;

P.S.
Я думаю поставить проверку в Application.OnIdle...


 
/glokk   (2004-09-02 12:28) [10]

Да, кстати - проверка даты файла тоже в похожем режиме должна производиться. Тоже чтоб не помешала.

Вообще, как все это себя ведет.... в то время когда файл DBF открыт как таблица базы данных к ней обращаются как к обычному файлу на предмет считывания даты. Моих знаний не хватает чтобы ответить на этот вопрос, поэтому я к Вам и обратился


 
KSergey ©   (2004-09-02 12:30) [11]

Она и не помешает
Она вообще ему не помешает в любом случае, если только в файл не будет производиться запись
А уж неудачная попытка открытия - точно е помешает.

isDone := FALSE;  { Boolean }
while NOT isDone do
try
 BatchMove;
 isDone := TRUE;
except
end;


> Я думаю поставить проверку в Application.OnIdle...

Сто раз же сказано: НЕ НАДО ПРОВЕРОК!!!
Надо брать - и делать.


 
KSergey ©   (2004-09-02 12:32) [12]

> [10] /glokk   (02.09.04 12:28)
> Да, кстати - проверка даты файла тоже в похожем режиме должна
> производиться. Тоже чтоб не помешала.

Еще раз: чтение и открытие файла в режиме чтения не мешает никому. Ну кроме как открытие эксклюзивное - оно, понятно, не даст кому-либо еще открыть файл.

> Вообще, как все это себя ведет.... в то время когда файл
> DBF открыт как таблица базы данных к ней обращаются как
> к обычному файлу на предмет считывания даты.

Для файловой системы нет различия открыт файл как таблица БД или как-то еще. Для нее все файлы равны ;)


 
Алхимик ©   (2004-09-02 12:33) [13]


> Т.е. я звоню оператору, говорю - "сбрось мне последние данные".
> У них база на FoxPro 2.5.(DOS) - они сбрасывают

И добавляешь:
"А потом пускани мою утилиту MyImportData.exe"


 
/glokk   (2004-09-02 13:00) [14]

Уважаемый KSergey. Спасибо - я понял ваш дельный комментарий (в отличие от другого человека, который выбрал себе очень подходящий ник...). Только давайте окончательно - в вашем:

"чтение и открытие файла в режиме чтения не мешает никому."

подразумевается открытие КАК ТАБЛИЦА БД или КАК ФАЙЛ...


 
Skyle ©   (2004-09-02 13:08) [15]


> [14] /glokk   (02.09.04 13:00)

Для KSergey ©  , также как и для файловой системы, абсолютно сиренево, что это за файл. Бывают файлы, просто файлы...


 
oldman ©   (2004-09-02 17:01) [16]


> /glokk  


"Файл, открытый КАК ФАЙЛ" - перевели...


 
KSergey ©   (2004-09-02 17:23) [17]

> /glokk   (02.09.04 13:00) [14]
> подразумевается открытие КАК ТАБЛИЦА БД или КАК ФАЙЛ...

Я чета не понял на кого был наезд в этом посте, ну да ладно.
Ответ на вопрос есть в посте [12], последняя строка


 
Reindeer Moss Eater ©   (2004-09-02 17:29) [18]

Открытость/неоткрытость файла ВО ВРЕМЯ ПРОВЕРКИ это не одно и то же что открытость/неоткрытость файла во время импорта данных.

Это все равно как сходить без кошелька в магазин, что бы убедиться что там есть пиво.
Потом вернуться за деньгами и идти покупать то пиво.
А его уже и след простыл.


 
Anatoly Podgoretsky ©   (2004-09-02 19:30) [19]

/glokk   (02.09.04 11:59) [6]
Т.е. я звоню оператору, говорю - "сбрось мне последние данные". У них база на FoxPro 2.5.(DOS) - они сбрасывают.

Далее оператор говормт сбросил и ты выполняешь свою работу, иначе тебе ничего не поможет.


 
Fay ©   (2004-09-02 22:06) [20]

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;
?



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

Текущий архив: 2004.09.19;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.074 c
14-1093525768
Копир
2004-08-26 17:09
2004.09.19
H E L P. Damned Javaw !


14-1093570865
Думкин
2004-08-27 05:41
2004.09.19
С днем рождения! 27 августа


1-1094387863
pavelgr
2004-09-05 16:37
2004.09.19
tmemo


3-1093085647
Piter
2004-08-21 14:54
2004.09.19
Странное поведение RecordCount


14-1094046510
lipskiy
2004-09-01 17:48
2004.09.19
Анекдот прикольный вспомнил