Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > разблокировать файл


Автор: jimbo 24.11.2009, 19:57
Привет всем.

почитал форум но так и не нашел ответ на вопрос


Есть файл.
Есть процесс.

Один хендл пишет в файл. Сам хендл нам не дан, используем функцию сторонней библиотеки

Второй хендл пытается писать в файл, но он блокирован

Как разблокировать файл чтобы суметь прочитать данные? 

Автор: siew 25.11.2009, 09:37
Насколько я понимаю, то пока у тебя файл открыт грубо говоря одним хэндлом (всё равно для записи или для чтения) то другим хэндлом ты не подступишься к файлу. Сначало нужно закрыть тот первый а потом открывать файл для второго хэндла.
P.s. пытался писать на твоём языке =)

Автор: jimbo 25.11.2009, 11:06
Цитата

Насколько я понимаю, то пока у тебя файл открыт грубо говоря одним хэндлом (всё равно для записи или для чтения) то другим хэндлом ты не подступишься к файлу


да это понятно.


есть функция вида


Код

int open(char* filename);


есть функции записи в этот файл

Код

int write(char* message);


все функции - публичные функции класса. код мы не видим. реализация записи в файл тоже скрыта.


и мой код вида:
Код

hFile = CreateFile(RegisterGetPath(),GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hFile!=INVALID_HANDLE_VALUE)


и собственно hFile==INVALID_HANDLE_VALUE. GetLastError выдает 
32 The process cannot access the file because it is being used by another process.  ERROR_SHARING_VIOLATION 

мой вопрос, как закрыть хендл принудительно и открыть моим кодом? Или это невозможно?

Автор: Alek86 25.11.2009, 12:38
это не невозможно, но трудно
в общем случае, думаю, тебе нужно просканировать всю систему на хендлы на этот файл
да и некрасиво это как-то

может проще дождаться, пока файл не разблокируется?

Автор: siew 25.11.2009, 14:43
Я такого мнения, что знания хэндла открытого файла много не даст, так как он относиться к адресному пространству того процесса который его открыл. А вот внедрится в это адресное пространство и осторожно закрыть хэндл может и сработать. Для внедрения использовать ловушку. А закрыть можно по какому-нить событию, которое можно и самому создать. А после того как этот хэндл будет закрыт, то можно уже и своим процессом открывать.
Чё на это скажете? 

Автор: jimbo 26.11.2009, 12:25
спасибо за ответы.

Цитата

думаю, тебе нужно просканировать всю систему на хендлы на этот файл


Как это сделать? хотя бы название функции, я просто не в курсе вообще.

Цитата

А вот внедрится в это адресное пространство и осторожно закрыть хэндл может и сработать


процесс один. хендла нет. или как закрыть все хендлы, принадлежащие определенному файлу?

Цитата

может проще дождаться, пока файл не разблокируется? 


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)