Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];

Вниз

Как получить хендл открытого другим приложением файла?   Найти похожие ветки 

 
Прохожий   (2002-11-13 18:06) [0]

Доброго времени суток, всемогущий ALL.

Возникла проблема в получении хендла открытых файлов.
Код
FileHandle:=CreateFile(PChar("FileName"), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

Дает -1 (INVALID_HANDLE_VALUE)

Файл FileName не заблокирован, нормально копируется средствами Windows


 
Прохожий   (2002-11-14 12:41) [1]

Что, никто не знает? Не верю!
Windows Commander напримет открывает свим въювером файлы
не взирая на то, что они уже открыты на запись.
КАК он это делает????


 
Arcus   (2002-11-14 12:47) [2]

Использую FILE_SHARE_READ с FILE_ATTRIBUTE_READONLY всегда. Вроде работает. А ОС какая?


 
Прохожий   (2002-11-14 13:52) [3]

ОС Windows 98.
Пробовал NT - тоже самое :(

Попробовал сейчас с FILE_ATTRIBUTE_READONLY - всё то же самое (FileHandle=INVALID_HANDLE_VALUE и GetLastError=32)

Кстати API функция CopyFile(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL) этот файл копирует без проблем.

Значит ОС всё же может файл читать!!!


 
Arcus   (2002-11-14 16:24) [4]

Код из исходников. Работает. В чем разница - не вижу. М.б. с Filename проблемы?
Name: PChar;
FileHandle: THandle;
...
FileHandle:= CreateFile(Name, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0);
if FileHandle = INVALID_HANDLE_VALUE then exit;
...


 
Прохожий   (2002-11-15 07:18) [5]


Код из исходников. Работает. В чем разница - не вижу. М.б. с Filename проблемы?

С Filename проблем нет. GetLastError возвращает 32. Вероятно файл Filename открыт с каким то иным (не FILE_SHARE_READ) режимом.

Но ведь другие то (Windows Commander Viewer например) этот файл ОТКРЫВАЮТ для чтения !!!

Хотя это чуть ли не единственный кто может :(

Да, это нужно для системы автоматического BackUp_a btrieve базы.
Выгнать программно всех пользователей (освободить файлы) нереально, реально только отслеживать активность...


 
Прохожий   (2002-11-15 07:41) [6]

Опсс

FileHandle := OpenFile( PChar( FileName ), fInfo, OF_READ );

РАБОТАЕТ !!!
Спасибо ребятам из ветки
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1037283937&n=5


А в Win32 programmer"s refrence пишут :

OpenFile

This function is provided for compatibility with 16-bit versions of Windows. In particular, the OpenFile function cannot open a named pipe. Win32-based applications should use the CreateFile function.

Вот и верь после этого...


 
DarkGreen   (2002-11-15 08:26) [7]

2 Прохожий: Ну и что ты таким образом отбэкапишь???? База юзерами открыта а ты ее копируешь. И что ты получишь? Как минимум нарушение ссылочной целостности, как максимум нерабочую базу. Если система работает не 24 часа в сутки значит можно выбрать время когда бэкапить базу (хотя бы поздно ночью).


 
Прохожий   (2002-11-15 09:10) [8]

То DarkGreen © :
База будет бэкапиться когда пользователи не активны. Это действительно будет ночью. Btrive сбрасывает кэш в файлы через определенный период неактивности (задается в настройках ядра).
Таким образом, несмотря на то, что к базе есть подключенные пользователи (файлы базы открыты ) база непротиворечива после заданного времени неактивности.

ЗЫ "У нас в политбюро не дураки сидят - на солнце ночью полетите" (С) Анекдот


 
DarkGreen   (2002-11-15 09:56) [9]

2 Прохожий: А-а-а, это другое дело :-) Но почему бы не воспользоваться каким-нить консольных архиватором (pkzip, rar, arj)? У нас btrieve базы rar"ом архивируются, простой bat файл написали и все.


 
Прохожий   (2002-11-15 10:10) [10]

То DarkGreen © :
Базы большие(~1.5 Gb), изменений за день бывает от силы 2-3 Mb.
Есть идея (на 99 процентов реализованная) бэкапить только измения, причем не глядя на содержимое файла - просто сравнивается с предыдущей копией и ищутся неодинаковые части - они и есть то, что нужно сохранять для последующего, не дай бог (тьфу тьфу тьфу), восстановления.
Довольно долго правда получается :( Но ничего, ночи у нас длинные ;о)
Зато ежедневный diff файл маааленький.



 
DarkGreen   (2002-11-15 11:19) [11]

2 Прохожий: 1,5 Gb это не большая, а средняя база (по нынешним временам). У нас суммарный объем баз Btrieve ~10Gb и архивируются они полностью. Но если жаль дискового пространства и нет необходимости востанавливать БД за определнный период (допустим вернуться на 5 дней назад), то ты можешь архивировать только обновленные файлы (параметры командной строки для этого есть у любого консольного архивера) в уже существующий архив, это будет быстрее. Сравнивать программно сождержимое файлов Btrieve нет смысла, достаточно посмотреть размер или дату последнего изменения файла, это будет намного быстрее (так архиваторы и поступают)


 
Прохожий   (2002-11-15 12:25) [12]

Есть необходимость восстанавливать базу не только 5 дней назад, а и год назад.
Специфика такая. Под это всё и затачивается.
Лишних ~900Мб.arj * 300дней нет.
Смысл есть всегда.
ИМХО архивы работают в атрибутом архивности -
нет смысла смотреть на размер файла (файл может быть изменен но размер останется прежним). Дата тоже не показатель.


Спасибо за ответ на основной врпрос.
Проблема решена. Не уверен, что флейм про архиваторы интересен в этой конфе. Если есть вопросы - мой e-mail drnil<at>gmx<точка>net


 
DarkGreen   (2002-11-15 13:44) [13]

Ну если нет лишних 300*900Мб, то можно поступить по другому.
Прога наверняка рабатает периодично, то бишь есть такое понятие как начало месяца и конец месяца (иль какие другие прзнаки начала и конца периода). Тогда просто раз в месяц архив сбрасывается (иль в неделю, в общем в конце периода) на CDRW и хранится там, а архивы в текущем периоде хранятся на диске (после окончания периода они естественно уничтожаются). В общем все. :-)



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

Форум: "WinAPI";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.041 c
4-99420
Dimon14
2002-11-15 02:51
2002.12.30
Как отследить изменение битовой матрицы, например какя то часть д


6-99232
igorx
2002-11-05 10:54
2002.12.30
Контроль подключения к Интернет


14-99310
harismatik
2002-12-09 20:27
2002.12.30
Категории спайдеров


14-99266
Shuric
2002-12-11 21:51
2002.12.30
C -> Pascal


1-99141
4D man
2002-12-18 14:02
2002.12.30
Факториал дробного числа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский