Текущий архив: 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