Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как грамотно проверить файл на возможность его открытия [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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо