Як грамотно перевірити файл на можливість його відкриття

як грамотно перевірити файл на можливість його відкриття

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

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

Інакше буде безграмотно.

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

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;

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

А хто сказав, що після виконання перевірочного коду файл залишиться в такому ж стані?

Чи не потрібен ніякий код перевірки тому що він не відповідає на поставлене запитання.

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

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

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

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

З усього випливає - мені не треба відкривати файл, мені треба лише перевірити, чи можна його відкрити. Причому відкрити не як файл БД, а як звичайний файл. Інакше кажучи - переконатися що в даний момент файл не використовується. Мета - щоб BatchMove запускався гарантовано після фіналу роботи FoxPro. мати її


> З усього випливає - мені не треба відкривати файл, мені треба
> Лише перевірити, чи можна його відкрити.

Це можна зробити, тільки відкривши його
Або написати драйвер файлової системи режиму ядра. Тобі воно треба?

У FoxPro відкривати в ексклюзивному режимі (у яких у себе намагатися ексклюзивно)

А ось це

> [6] / glokk # XA0; (02.09.04 11:59)
> Щоб зробити BatchMove НЕ обязятально відкривати файл.

я зовсім не зрозумів
Як це "не над відкривати". Може і не явно, але файл в будь-якому випадку відкривається, коли відбувається читання.
А тому читай Reindeer Moss Eater - він вірно пише.

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

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

Так, до речі - перевірка дати файлу теж в схожому режимі повинна проводитися. Теж щоб не завадила.

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

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

isDone: = FALSE; # XA0;
while NOT isDone do
try
# XA0; BatchMove;
# XA0; isDone: = TRUE;
except
end;

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

Сто раз же сказано: НЕ ТРЕБА ПЕРЕВІРОК.
Треба брати - і робити.

> [10] / glokk # XA0; (02.09.04 12:28)
> Так, до речі - перевірка дати файлу теж в схожому режимі повинна
> Проводитися. Теж щоб не завадила.

Ще раз: читання і відкриття файлу в режимі читання не заважає нікому. Ну крім як відкриття ексклюзивне - воно, зрозуміло, не дасть будь-кому ще відкрити файл.

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

Для файлової системи немає різниці відкритий файл як таблиця БД або якось ще. Для неї всі файли рівні;)


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

І додаєш:
"А потім пускання мою утиліту MyImportData.exe"

"Читання і відкриття файлу в режимі читання не заважає нікому."

мається на увазі відкриття ЯК ТАБЛИЦЯ БД або ЯК Фото.

"Файл, відкритий ЯК Фото" - перевели.

> / Glokk # XA0; (02.09.04 13:00) [14]
> Мається на увазі відкриття ЯК ТАБЛИЦЯ БД або ЯК Фото.

Я подружжя не зрозумів на кого був наїзд в цьому пості, ну да ладно.
Відповідь на питання є в пості [12], останній рядок

Відкритість / невідвертість файлу ПІД ЧАС ПЕРЕВІРКИ це не одне і те ж що відкритість / невідвертість файлу під час імпорту даних.

Це все одно як сходити без гаманця в магазин, що б переконатися що там є пиво.
Потім повернутися за грошима і йти купувати то пиво.
А його вже й слід прохолов.

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

Далі оператор говормт скинув і ти виконуєш свою роботу, інакше тобі нічого не допоможе.