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


Автор: MakedoneZ 22.1.2007, 11:00
При нажатии на мои файлы,выскакивает прога,запрашивает ключ шифра,расшифровывает файл.
Далее мне надо,чтоб при закрытии файла,он заново зашифровывался.
Т.е. надо чтоб прога "ждала" закрытия файла,а затем начала шифровку.
Но проверять постоянно таймером,открыт ли файл это не то.
Можно ли как-нибудь моему приложению получить сообщение от ОС,что конкретный файл был только что закрыт?
Если да,то как? Если можно,приведите прожалуйста примитивный пример.
Спасибо... 

Автор: MetalFan 22.1.2007, 11:07
ОС не посылает никаких сообщений при "закрытии" файла, AFAIK.
кто файл открывает? жди завершения процесса, что этот файл открыл. других вариантов в голову не приходит.

Автор: Sunvas 22.1.2007, 12:47
Цитата(MetalFan @  22.1.2007,  11:07 Найти цитируемый пост)
AFAIK

Как это расшифровывается? sokr.ru ничего не находит.  smile 


MakedoneZ, что понимаешь под "закрытием файла"? Что значит файл "закрыт"????
Опиши подетальнее свою прогу, ибо понять тебя невозможно.

Автор: Romikgy 22.1.2007, 12:54
имхо лучше делать это в памяти , открыл файл , записал в память , расшифровал, поработал , зашифровал , сохранил в файл

Автор: MetalFan 22.1.2007, 13:29
Sunvas, AFAIK - As Far As I Know (на сколько я знаю)

Romikgy, поиграем в телепатов. я понял, что автору надо открыть другое приложение в котором должен открыться уже расшифрованный файл...

Автор: MakedoneZ 22.1.2007, 14:13
У меня программа шифровки файлов.
1)Файл шифруется
2)В конец файла вписываются данные о том,какое у него было расширение + номер алгоритма из крипто-библиотеки.
3)Т.к. файл теперь имеет "мое" расширение,то при его открытии запускается моя прога.
(естественно мое расширение зарегистрировано в реестре,со всеми нужными данными).
4)При открытии файла защищенного моей программой,выскакивает InputBox,который предлагает ввести ключ шифра.
5)Из файла вынимаются первичные данные о  его истинном расширении + об алгоритме шифровки.
С учетом ключа файл расшифровывается соответствующим алгоритмом.Этот файл запускается при помощи ShellExecute.И юзер с ним работает,возможно вносит изменения.
6)Моя программа,которая расшифровала файл при его открытии юзером,тихо сидит и ожидает его закрытия.
7)Как только поступает сигнал о том,что юзер закрыл этот файл,она начинает в тихом режиме зашифровывать его обратно.Затем закрывается.


Иными словами,файл остается расшифрованным лишь в момент его работы с юзером у которого есть ключ.Функция шифрования построена так,что она берет данные из одного потока,а зашифрованные данные помещает в другой.В данном случае данные берутся из TFileStream,пишутся в TMemoryStream.
Чтоб не повредить файл,в случае,если вдруг во время расшифровки произойдет ошибка.
А иначе получится что часть файла зашифрована,а чать - открытый текст. 
Также осуществляется проверка целостности и прочее,прочее,но это все не имеет отношения к моему вопросу.Я лишь постарался как можно обширнее описать все.


И вот мой вопрос:
Прочитайте пункт 6.
Как мне получить сообщение о том,что открытый и расшифрованный файл был только что закрыт.Что работа с ним юзером преостановлена.

Добавлено @ 14:17 
Я хочу узнать когда закрылся ЧУЖОЙ файл,открытый МОЕЙ прогой,чтоб зашифровать его заново.

Автор: Romikgy 22.1.2007, 14:21
Цитата(MakedoneZ @  22.1.2007,  13:13 Найти цитируемый пост)
Прочитайте пункт 6.
Как мне получить сообщение о том,что открытый и расшифрованный файл был только что закрыт.Что работа с ним юзером преостановлена.

WaitForSingleObject+INFINITE

Автор: dumb 22.1.2007, 15:42
MakedoneZ,
можно, например, перехватить CreateFile и CloseHandle, "отловить" хэндл твоего файла, и ждать пока он приплывет в CloseHandle(возможны "косяки", если открывающая программа будет пользовать всякие ReOpenFile/DuplicateHandle)...

но imho в данном случае таймер - самое оно. smile

Автор: MakedoneZ 22.1.2007, 15:59
Цитата(dumb @  22.1.2007,  15:42 Найти цитируемый пост)
но imho в данном случае таймер - самое оно. 

А он не будет тормозить всю систему?

Автор: dumb 22.1.2007, 23:21
Цитата(MakedoneZ @  22.1.2007,  15:59 Найти цитируемый пост)
А он не будет тормозить всю систему?

нет, не будет(omg, и где набрались то такого?!). интервал ставь где-то 200-500.


Автор: MakedoneZ 23.1.2007, 14:32
Цитата(Romikgy @  22.1.2007,  14:21 Найти цитируемый пост)
WaitForSingleObject+INFINITE 

Все же реализовал этим способом:
Код

procedure WaitForFileClose(Path: AnsiString);
var
 ShellExecuteInfo: TShellExecuteInfo;

begin
 FillChar(ShellExecuteInfo, SizeOf(TShellExecuteInfo), 0);
 with ShellExecuteInfo do begin
   cbSize := Sizeof(TShellExecuteInfo);
   fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
   Wnd := Application.Handle;
   lpFile := PChar(Path);
   lpVerb := 'Open';
   nShow := 1;
 end;

 if ShellExecuteEx(@ShellExecuteInfo) then
   WaitForSingleObject(ShellExecuteInfo.hProcess,INFINITE);
end;


Всем спасибо за помощь.  smile 

Автор: dumb 23.1.2007, 15:06
вообще, метод "кривой", потому что "закрытие файла" != "закрытие приложения". я могу закрыть файл и продолжать работу в ворде. потом, ты проверял что будет, если приложение уже открыто до того, как ты его запустишь со своим файлом?

если ты пишешь только для себя, то "и так сойдет"... в противном случае купи каску. smile

Автор: Sansa 23.1.2007, 15:26
Ну, можно проверять сам файл, например попытками открыть его с Share Deny Read в цикле (потоке). И при успешном открытии предполагаем, что приложение уже "отпустило" файл.

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

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