Временные файлы

garrick

Lotus team
26.10.2009
901
61
#1
Бывает, что в процессе работы надо создать временный файл. Не проблема если ваш код (агент) сможет его потом сам удалить, но иногда надо этот файл отдать пользователю, например при генерации PDF или Excel файлов - открыть их в соответствующем приложении, отображающем их содержимое. Удалить такой файл ваш агент самостоятельно уже не сможет. Они копятся, копятся ...и, бах! место на диске кончилось. Утрирую, конечно, но вдруг...

Выдалась свободная минутка и озадачился решить эту проблему. После вскрытия пациента и анализа содержимого было выявлено, что Lotus Notes в своём временном каталоге создаёт файл ~notetmp.reg, куда записывает все свои временные файлы. При закрытии Lotus Notes пытается эти файлы удалить. Если не получилось, то пытается сделать это ещё раз при последующем запуске.

Стало быть для того, чтобы наши временные файлы были более-менее успешно удалены и пользователи не ругались на программистов нехорошими словами, что они им все жесткие диски чем-то загадили, надо записать имена наших временных файлов в лотусовый ~notetmp.reg - пусть он за нас их и удаляет. Сам же ~notetmp.reg не простой текстовый файл, но нас этим не напугаешь :)

Готовое решение
Для просмотра контента необходимо: Войти или зарегистрироваться


Пример использования:
Java:
Session session = NotesFactory.createSession();
NotesTempFile tempFile = new NotesTempFile(session);
File file = tempFile.getTempFile("pdf");
 
Симпатии: Понравилось lmike

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#2
интересная логика.
Создать файл агент может, а удалить нет? Это как?
 

garrick

Lotus team
26.10.2009
901
61
#3
Последняя строка в агенте
Код:
Desktop desktop = Desktop.getDesktop();
desktop.open(file);
если файл сразу удалить, то он не откроется в внешнем приложении, а потом агента уже не будет в живых.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#4
Прикрепленный файл по определению будет регистрироваться для удаления, а смысл регистрировать файл для удаления, если он создается пользователем сознательно?
не, ну каждый сходит с ума по своему...
 

garrick

Lotus team
26.10.2009
901
61
#5
Может я в чём-то не прав, просвятите меня, пожалуйста. Есть агент, который формирует что-то в PDF, Excel, Word и т.п. Для этого используется временный файл, который после окончания формирования отрывается на рабочем месте пользователя в Arcobat Rerader, Excel, Word и т.п. для просмотра, редактирования, печати. После того как пользователь сделал своё дело, он просто закрыл приложение через которое смотрел или распечатывал файл. И как потом удалить такой файл? Или пусть копятся - жесткие диски нынче большие? :)

У меня таких агентов много, они формируют всякие печатные формы, отчёты и пр., запускаются пользователями часто, временные каталоги засоряются очень быстро. Может быть я что-то делаю не так?
 
06.12.2011
468
134
#6
Гарри, это был мой бифштэкс! (с) Человек с бульвара Капуцинов.

Только 1 вопрос к топикстартеру: Вы оказались крайним в вопросе кэширования фотографий, видио, 1С и т.д. и т.п.?
Можем оказать психологическую помощь, на большее.... не, ну нальём конечно ...


ЗЫЖ От Игоря не ожидал такого
package com.github.igor_kudryashov.utils.notes;
 
Последнее редактирование:

savl

Lotus team
28.10.2011
2 136
105
#7
@garrick попробуй открывать через :
Java:
Process p = Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + FileObj.getAbsolutePath());
p.waitFor();
Вроде должен ждать закрытия файла, но так как это отдельный поток, то клиент не фризится.
 

garrick

Lotus team
26.10.2009
901
61
#10
Гарри, это был мой бифштэкс! (с) Человек с бульвара Капуцинов.

Только 1 вопрос к топикстартеру: Вы оказались крайним в вопросе кэширования фотографий, видио, 1С и т.д. и т.п.?
Можем оказать психологическую помощь, на большее.... не, ну нальём конечно ...


ЗЫЖ От Игоря не ожидал такого
package com.github.igor_kudryashov.utils.notes;
Перечитал несколько раз очень внимательно. Ничего не понял.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#12
@garrick попробуй открывать через :
Java:
Process p = Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + FileObj.getAbsolutePath());
p.waitFor();
Вроде должен ждать закрытия файла, но так как это отдельный поток, то клиент не фризится.
если запустили несколько раз и файлы не закрыли?
неустойчивая ситуация...
не понимаю - в чем "укор" ТС от остальных?
временные файлы могут не удаляться по разным причинам, на компе юзера...
упало приложение/лочится файл АВ... и нотусня - рядовое приложение, кот. не может ситуацию контролировать
Предложенный вариант, лично мне, нравится
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#13
Так в этом-то и суть. Что регистрировать, если это сознательно?
файлы создаются приложением и открываются юзеру в интерактиве, для дальнейшего воздействия (кот. нотусня уже не должна котролировать)
но сами файлы открываются из ФС (например), при этом существуют в приложенном варианте, к доку нотусни
т.е - после неких манипуляций, вне нотусни, они в ФС не нужны
 

savl

Lotus team
28.10.2011
2 136
105
#14
если запустили несколько раз и файлы не закрыли?
У меня открывали по 10-15 pdf и норм.
Если имена файлов будут разные, что для временных файлов должно быть именно так, то ничего не будет. Ну или рухнет клиент, когда память "выжрется".
Если файлы не закрыли, но закрыли лотус - файлы должны закрыться, но они не удалятся.
Если клиент рухнет, то сценарий закрытия клиента отработает.

Про notestemp.reg не знал, прикольно, беру на вооружение.
Вот только есть одна трабла, в какой-то версии 9-ки это не срабатывало удаление при закрытии клиента, потом вроде вернули + настройка в ini.
Для просмотра контента необходимо: Войти или зарегистрироваться
, поправили в FP6 только:
SPR# WHAM7ESERK - Fixes issue where temporary attachment files from the system temp directory were not deleted when Notes was closed/restarted. Additionally, an optional new Notes INI variable to delete files from the Notes temporary attachments directory upon Notes close/restart: AttachmentsDirectoryDelete=1 has been provided. This is off by default.
но у меня как была куча файлов из ПЯ - так и оставалась... Сейчас не актуально.
 
06.12.2011
468
134
#15
Перечитал несколько раз очень внимательно. Ничего не понял.
Вы, извините, дурью маетесь. Как выше было сказано "каждый сходит с ума по своему" NickProstoNick(с) Это он еще вежливый.

я вам хотел намекнуть, что не лотус виноват в загрузке трэша, там много кто отмечается, с какого перепоя лотус виноват?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#16
я вам хотел намекнуть, что не лотус виноват в загрузке трэша, там много кто отмечается, с какого перепоя лотус виноват?
а такое было?
ситуация предельно проста - приложение создало файл в ФС и этот файл открыли системным приложением, для юзера, для дальнейших действий...
что здесь странного?
Далее... код перестал отслеживать файл - это нормально, ибо им занимается уже постороннее приложение
Для приложения нотусни этот файл "временный", предложено его удалять как временный, механизмами нотусни
Что не так?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#17
Прикрепленный файл по определению будет регистрироваться для удаления, а смысл регистрировать файл для удаления, если он создается пользователем сознательно?
не, ну каждый сходит с ума по своему...
пользователь не создает файл сознательно и даже не знает - где он расположен, ему предоставляют возможность визуализации информации в системном приложении, для дальнейших действий
 

garrick

Lotus team
26.10.2009
901
61
#18
Вижу не все поняли причину моего беспокойства на счёт временных файлов, а также природу их появления. Попробую объяснить на пальцах. Вы же видели в каком-нибудь М-Видео или Техносиле как продают технику в кредит. Человек с той стороны компьютера забивает в него ваши данные и говорит, что надо некоторое время подождать одобрения. В случае положительного решения банка он распечатывает пакет документов и даёт их вам на подпись. В зависимости от типа кредита количество документов может быть от 3-5 и более. Как минимум кредитный договор+график погашения кредита+соглашение о персональных данных и +, скорее всего, ещё какая-нибудь инструкция о том как гасить кредит+вам постараются впарить какую-нибудь левую страховку или дополнительную гарантию+ещё чего нибудь. И представьте себе, что там стоит Lotus Notes. Т.е. ваш агент в Lotus Notes генерит все эти документы, создавая обычные временные файлы во временном каталоге OS. Затем открывает их в Acrobat Reader, чтобы можно было распечатать, и на этом завершает свою работу. Дальнейшая судьба этих временных файлов неведома ни вашему агенту, ни Lotus Notes, ни тем более Acrobat Reader. Когда именно пользователь распечатает их и закроет Acrobat Reader неизвестно. За рабочую смену такое рабочее место обычно обслуживает 50-70 клиентов. Это 250-300 временных файлов (каждый день). Они копятся, копятся, копятся... Ведь тот человек, с той стороны компьютера, вообще не знает что такое временные файлы, временный каталог Windows и где это находится. А как вы думаете, какое количество файлов в одном каталоге безболезнено сможет выдержать Windows? Не теоретически, а на практике?

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

@savl держать 200-300 открытых процессов, ожидающих завершение, запущенной через rundll32 программы, мне кажется не рационально. Тем более, как мне кажется, это будет аналогичное количество "зависших" агентов. При каком счёте они перестанут вообще запускаться без всяких сообщениях об ошибках?
 

savl

Lotus team
28.10.2011
2 136
105
#19
держать 200-300 открытых процессов, ожидающих завершение, запущенной через rundll32 программы, мне кажется не рационально. Тем более, как мне кажется, это будет аналогичное количество "зависших" агентов. При каком счёте они перестанут вообще запускаться без всяких сообщениях об ошибках?
Ну это не совсем верно, чтобы 200-300 процессов висело, эти документы надо держать на экране... А так, после закрытия поток освобождает файл, тут его можно и снести.
Но, как уже написал выше, мне Ваш вариант больше нравится.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#20
Агент создает файл, цепляет его в документ и удаляет файл с диска. Все. Больше ничего не надо.
При открытии из документа файл автоматом зарегится для удаления.
Да, добавится лишний клик для пользователя, но решит массу проблем для разработчика.
Так что для чего этот велосипед - не ясно