|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Ну т.е. есть файл скажем test.tif и лежит пусть в App.Path Надо 1) Распечатать его на выбранный принтер (прога знает) 2) Сразу же удалить (ну не нужен он мне по логике вопроса!) Код (тестовый, иллюстрирующий суть полностью в аттаче): Код: plaintext 1. 2. 3.
В итоге файл удаляется раньше чем печатается и первая строка не работает. Если DeleteFile убрать, то все работает. Задача без решения? Задержку - не хочу. Во первых она очевидно разная для 1 страницы и для 10 страниц. Во вторых то-то и ценно что ShellExecute не тормозит прогу, а скидывает задание "системе". ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 00:31 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
> Автор: Дмитрий77 > Задача без решения? В общем случае судя по всему да В каких-то частных случаях может быть какое-то решение. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 10:14 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Игорь ГорбоносВ общем случае судя по всему дагм я обычно грохаю временные файлы при выходе из проги, а также при входе в нее (на случай, если вдруг выход завершился аварийно) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 11:26 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
> Автор: Shocker.Pro > я обычно грохаю временные файлы при выходе из проги, а также при входе в нее (на случай, если вдруг выход > завершился аварийно) Не ты один , но подождем Дмитрия :) Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 11:35 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Shocker.Proя обычно грохаю временные файлы при выходе из проги,...(на случай, если вдруг выход завершился аварийно) Думал об этом. Метод "временных файлов" я местами применяю, контроль при входе/выходе да, делаю, но удаляю штатно обычно когда наступает "понимание что файл больше не нужен". Но во-первых много мусора в temp (вдруг юзер прогу долго не перегружает, а объемы большие), а во вторых у меня в этом компоненте всегда Shocker.Proслучай, если вдруг выход завершился аварийно) Я конечно неграмотная темнота, но всегда закрываю его так из другого компонента(меня устраивает): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
Shocker.Proа также при входе в нее Ну не знаю хорошо ли это будет. А вообще суть в моем случае в чем. Прога генерирует файлы TIFF. В зависимости от настроек файл сохраняется в TIFF или PDF (типа "навсегда"). Но исх. файл всегда в TIFF. 1. TIFF 1) По появлению файла *.tif 2) Обрабатываем то чего с ним связано, например распечатываем 3) этот tiff остается лежать где и образовался 2. PDF 1) По появлению файла name.tif 2) Конвертируем path\name.tif в path\name.pdf 3) Обрабатываем то чего с ним связано, например распечатываем , при этом может использоваться name.tif из пункта (1) 4) по окончании обработки удаляем name.tif, а name.pdf остается лежать Естественно я могу в пункте (3) делать printto(pdf) вместо printto(tif), но это чревато. printto(pdf) обычно исполняется Acrobat Reader, но там есть проблема: незакрытие окна Acrobat Reader после печати. Будучи исполненной из под CURRENT_USER это приведет к выводу и неубиранию окна ридера, а будучи исполненной из-под System (в режиме as Service NT), это приведет к полному стопору/ступору. Решение как бы есть http://www.biopdf.com/acrowrap/close_adobe_reader.php но объяснять это user-у долго и не всегда эффективно. Т.е. я к тому, что на печать правильнее всегда посылать tiff, тем более он итак уже всегда существует (на момент исполнения). Хорошим вопросом будет такой: Как сделать: удаляю штатно ...когда наступает "понимание что файл больше не нужен". ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 13:45 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Чем не устраивает сгененерировать BAT-файл, в котором выполнить printto, затем удаление TIF, затем самоубийство BAT- файла (cmd /c del %0), и запускать BAT-файл из кода Shell-ом? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 15:49 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Предыдущее мое сообщение было юбилейным под номером FF , поэтому вместо TIF там должно быть все-таки TI FF :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 15:56 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
ZVIЧем не устраивает сгененерировать BAT-файл, в котором выполнить printto, затем удаление TIF,...и запускать BAT-файл из кода Shell-ом? 1) Я не уверен, что я смогу задать параметр для printto если bat-file CStr(Chr(34) & the_printer & Chr(34)) -произвольный!!!, а не default принтер 2) А будет ведь тоже самое скорее всего, TIFF удалится раньше, это ничего не меняет по сути ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 16:10 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Дмитрий771) Я не уверен, что я смогу задать параметр для printto если bat-file CStr(Chr(34) & the_printer & Chr(34)) -произвольный!!!, а не default принтер 2) А будет ведь тоже самое скорее всего, TIFF удалится раньше, это ничего не меняет по сути 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 17:04 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Дмитрий771) Я не уверен, что я смогу задать параметр для printto если bat-file CStr(Chr(34) & the_printer & Chr(34)) -произвольный!!!, а не default принтер 2) А будет ведь тоже самое скорее всего, TIFF удалится раньше, это ничего не меняет по сути Насколько я помню. в примере первоисточника вызов printto был как раз в BAT файле в препоследней строке, а в последней был вывод ERRORLEVEL. И последняя строка не выполнялась, пока не завершит свою работу ptintto. Насчет проблем с default принтером трудно что-то сказать, нужно проверять. Printto не заточен под свой драйвер принтера? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 17:16 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Выше было об утилите printto.exe , ссылку на которую Вы как-то давали. Если же здесь речь о произвольном принтере, то задумаюсь :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 17:36 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
ZVI, Вообще-то "printto" - это параметр для ShellExecute, а ShellExecute из бат-файла не вызовешь... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 18:00 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Shocker.ProВообще-то "printto" - это параметр для ShellExecute, а ShellExecute из бат-файла не вызовешь... Это понятно. Но в теме Печать заданного документа на заданный принтер Дмитрий давал ссылку на files.zip , в котром есть отдельная утилита printto.exe и пример print.bat её вызова. Но это только на случай, если речь о том же и утилита сгодится. В общем случае с ShellExecute всё хуже, нужно будет подумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.07.2011, 18:21 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
ZVIдавал ссылку на files.zip , в котром есть отдельная утилита printto.exe. Ну...если с той утилитой, то требуемый фокус работает. Утилита ждет конца печати. Тест во вложении. Не уверен, что я хочу использовать в приложении "ту утилиту" (а формально и права то не имею -там копирайт)... Да и плюс -таки тормоз на время печати. Вопрос чего она делает и как отсекает "процесс печати". Как я упомянал, она как-то завязана на .net ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2011, 19:29 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
В принципе, можно после запуска ShellExecute 0, "printto", ... по таймеру, например, раз в полсекунды, контролировать появление и исчезновение печатаемого документа в очереди печати заданного принтера. По исчезновению из очереди удалять файл документа. Чтобы не иметь проблем с дубликатами печатаемых документов лучше их имена делать уникальными. Понадобятся API-функции: OpenPrinter, ClosePrinter, EnumJobs, lstrcpy и проч. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 04:39 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
ZVIВ принципе, можно после запуска ShellExecute 0, "printto", ... по таймеру, например, раз в полсекунды, контролировать появление и исчезновение печатаемого документа в очереди печати заданного принтера.По исчезновению из очереди удалять файл документа.. например раз в полсекунды можно и НЕДО-контролировать. В предыдущем тике ЕЩЕ нет, в последующем - УЖЕ нет. ZVIЧтобы не иметь проблем с дубликатами печатаемых документов лучше их имена делать уникальными... При генерации имен файлов программа контролирует уникальность имен. Хотя есть возможность осуществлять печать одного и того же файла на более чем один принтер (уникальность имен принтеров в списке я контролирую в настройках). ZVIПонадобятся API-функции: OpenPrinter, ClosePrinter, EnumJobs, lstrcpy и проч. Не слишком ли большой огород для маленькой третьестепенной фичи? И потом, если делать всякие "контролирования", то надо выносить "очередь заданий на печать (в программе!)" в отдельный "процесс" (делать "буфер"), т.е. напр. сохранять "чего печатать" в таблице БД, и разбираться с этим "отдельным таймером" например. Я так делаю с аналогичной ф-цией "отправки файла по e-mail". Я же сейчас с печатью поступаю по принципу "Пихнул основным обработчиком в ShellExecute и забыл", это не тормозит основной обработчик. В принципе вместо всех API и всего огорода утилиты printto.exe достаточно (можно ее и hex-ом "доработать", не съедят). Но естественно запускать ее именно "отдельным таймером". Это ВАРИАНТ #1 но конечно требует дописывания кучи рутины. ВАРИАНТ #2 следовать совету Shocker.Pro, копировать исх. TIFF в temp с приставкой printto_ name.tif, его и печатать через ShellExecute. Это точно не испортит и не нарушит логику программы. Остается вопрос "ВЫВОЗ МУСОРА". Ну, удалять мусор при старте компонента (а по хорошему еще при удалении проги). Есть еще конечно ВАРИАНТ #3 -научиться БЕЗОБИДНО печатать pdf-ы (Reader это безобидно по дефолту не делает), но копания в сторону например печати из GhostScript-а (его я в проге итак уже использую) к успеху не привели -муторно. Еще правда ВАРИАНТ #4 использование printto.exe непосредственно из основного обработчика (с ожиданием). Но "ожидание" в основном обработчике меня смущает, он не должен "ощутимо отвлекаться". Т.е. все-таки больше склоняюсь к вариант #2, в меньшей степени к вариант #4. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 15:23 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Вариант 5: использовать объект Printer. Прочитать tif как картинку в IPictureDisp и сделать Printer.PaintPicture. Удалить файл можно между чтением и печатью — картинка будет в памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 15:30 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
AntonariyВариант 5: использовать объект Printer. ...Прочитать tif как картинку в IPictureDisp и сделать Printer.PaintPicture. У-у-у... Графическая (пере)(об)работка через GDI/GDI+ и печать средствами VB, это при том что в моем распоряжении изначально корректный(хороший) TIFF файл и аж 2 инструмента для его печати в одну строчку (да еще и на заданный(!) принтер). ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 15:56 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Графическая (пере)(об)работка через GDI/GDI+Зато не через фотошоп. Работать должны компьютеры, они для этого и предназначены. А люди — думать. аж 2 инструмента для его печати в одну строчку И оба хромают, моля о костылях. в моем распоряжении изначально корректный(хороший) TIFF файлБумаге пофиг. Если же нужно полиграфическое качество, то те два инструмета тоже не подойдут. Графическому объекту тоже пофиг из файла какого формата его создали. на заданный(!) принтерЗадать принтер в VB это проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 16:24 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Antonariyаж 2 инструмента для его печати в одну строчку И оба хромают, моля о костылях. И чем же они хромают? Кроме моего субъективного желания избавиться от файла "как только так сразу"? printto.exe кстати даже и не хромает. Не говоря о том, что то что вы предлагаете тоже требует "времени ожидания" (за счет времени обработчика) на реализацию GDI-преобразования + VB-печати. По сути это эквивалентно "printto.exe", разве что файл удаляете чуть может раньше (что не принципиально), но на "время ожидания" это вряд ли повлияет. >полиграфическое качество ну до полиграфии там по определению далеко. Речь идет о факсах 204x196 либо 204x98. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 16:38 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Кроме моего субъективного желания избавиться от файла "как только так сразу"?Я про него и говорю. Если вы от него откажетесь, то да, никакие GDI вам не нужны. За исключением костылей по сборке мусора "потом". А можно и его не собирать, бумага temp стерпит. Вопрос выбора. printto.exe кстати даже и не хромает.Таскать с собой лишний экзешник в вашем случае лучше, чем все в одном? Не говоря о том, что то что вы предлагаете тоже требует "времени ожидания" (за счет времени обработчика) на реализацию GDI-преобразования + VB-печати. Чихать на время. Печать это не та задача, где есть смыл гоняться за миллисекундами. GDI-преобразование + VB-печать (которая, к слову, от любой другой по времени отличается ну очень немного) в любом случае быстрее, чем запуск нового процесса, которому нужно выделять системные ресурсы, и который все равно сделает из тифа bitmap-представление в памяти чем-нибудь типа GDI. А может и тем же GDI. На загруженной системе разница будет видна невооруженным глазом. И вообще, при современных мощностях процессоров и скоростях памяти 90% задержки приходится на тормоза жесткого диска, с которого читается файл. А в случае с printto.exe прочитать нужно вообще два файла. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 17:25 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Дмитрий77например раз в полсекунды можно и НЕДО-контролировать. В предыдущем тике ЕЩЕ нет, в последующем - УЖЕ нет.Коллайдерный принтер? :-) Если документ окажется в spool-е, то файл докумета уже можно удалять. А если через нескольеко секунд таймаута документ не обнаружен, то его тоже можно удалять. Поэтому можно проверять и раз в секунду. При генерации имен файлов программа контролирует уникальность имен. Хотя есть возможность осуществлять печать одного и того же файла на более чем один принтер (уникальность имен принтеров в списке я контролирую в настройках)Это не проблема, у каждого принтера своя рчередь, там еще и имя владельца можно контролировать. Не слишком ли большой огород для маленькой третьестепенной фичи? И потом, если делать всякие "контролирования", то надо выносить "очередь заданий на печать (в программе!)" в отдельный "процесс" (делать "буфер"), т.е. напр. сохранять "чего печатать" в таблице БД, и разбираться с этим "отдельным таймером" например. Я так делаю с аналогичной ф-цией "отправки файла по e-mail". Я же сейчас с печатью поступаю по принципу "Пихнул основным обработчиком в ShellExecute и забыл", это не тормозит основной обработчик. В принципе вместо всех API и всего огорода утилиты printto.exe достаточно (можно ее и hex-ом "доработать", не съедят). Но естественно запускать ее именно "отдельным таймером". Это ВАРИАНТ #1 но конечно требует дописывания кучи рутины.Тоже имелось в виду "пихнуть ShellExecute-ом", а потом "немного" проконтролировать :-) Но я же не настаиваю, хотя по мне так неважно сколько строчек кода потребуется, делается то один раз. А вот использование API да, напрягает, если нужно чтобы еще работало и в 64-битных системах. ВАРИАНТ #2 следовать совету Shocker.Pro, копировать исх. TIFF в temp с приставкой printto_name.tif, его и печатать через ShellExecute. Это точно не испортит и не нарушит логику программы. Остается вопрос "ВЫВОЗ МУСОРА". Ну, удалять мусор при старте компонента (а по хорошему еще при удалении проги).Мне бы этого варианта тоже хватило. Для маньяков можно к TIFF файлам в конце ещё добавлять какой-нибудь идентификатор, например текст: "Дмитрий77". На распечатку это не повлияет. Или задавать и контролировать свойство документа, если они есть у TIFF. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 17:50 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Antonariyprintto.exe кстати даже и не хромает.Таскать с собой лишний экзешник в вашем случае лучше, чем все в одном? Если я решился таскать ghostscript 10MB, то таскать копеечный 10KB "printto.exe" погоды не сделает. И я часто предпочитаю использовать чужой exe (как правило злоупотребляю системными) через shell, нежели иметь "все в одном". "Все в одном" означает 10 доп. API-модулей засунутые "в одно", и еще с риском (если где-то что-то не учел случайно) завалить всю прогу. Хотя именно из-за нежелания таскать я и отказался от "printto.exe" в пользу ShellExecute в свое время. Плюс там стоит Копирайт как я упомянул. Забить теги через hex конечно не проблема, но если вы посмотрите в свойства, то там еще есть цифровая подпись и я не уверен, что ее можно захексить с сохранением работоспособности файла. На законность вышеуказанного мне честно говоря на...но все же:во всяком случае бухать ориг. файл с незатертыми копирайтами и подписями в свой пакет я бы не стал. AntonariyЧихать на время. Нет не чихать. Код выполняется из ОБРАБОТЧИКА СОБЫТИЙ, кот. работает по таймеру и реагирует на разные события, и пока прога чихает/курит/ждет/отвлекается/висит/тупит, таймер выключен и мониторинга процессов в real time не происходит. И хорошо если прога все обработает корректно и в правильной последовательности по выходу из ступора, а вдруг что-то не учел и время критично. Хотя я сам себе противоречу. С одной стороны хочу проскочить печать "без остановки" а с другой стороны хочу "дождаться, когда можно будет удалить файл". В итоге я все же остановился на варианте 2: копировать исх. TIFF в temp с приставкой printto_name.tif, его и печатать через ShellExecute. Это точно не испортит и не нарушит логику программы. Остается вопрос "ВЫВОЗ МУСОРА". Ну, удалять мусор при старте компонента (а по хорошему еще при удалении проги). По поводу "ВЫВОЗ МУСОРА". Сделал так: Код: plaintext 1.
1) при старте ОБРАБОТЧИКА 2) при убивании процесса ОБРАБОТЧИКА (как я писал он сам никогда не завершается нормально) в компоненты кот. убивают 3) в команду выполняемую при деинсталляции проги Здесь сразу вопрос: не подведет ли этот код 1) от XP до Win7 2) на x64 (не проверял) Раньше я бы использовал иную конструкцию: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Если по каким-то причинам какой-то файл не удалился(что НЕ критично), то код зациклится (что КРИТИЧНО). Изобретать еще один паравоз марки DEL с возможностью использования маски * и игнорирования, если файл вдруг не удалился, считаю нецелесообразным. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2011, 23:21 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
Не принципиально, но если GetEnvarVar("Temp"), как и Environ("Temp") , выдает значение переменной окружения, то это ненадежно. Пример, когда сбойнет, BAT-файл: Set Temp= Start MyProject.EXE Не зависит от переменной окружения вот это: CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2011, 00:39 |
|
Распечатать файл (printto) и сразу же удалить его
|
|||
---|---|---|---|
#18+
ZVIGetEnvarVar("Temp") Ну, если интересно, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Юзер может и без батника пойти в "Мой компьютер" и наменять, при этом должен отдавать себе отчет, не так ли? Когда я спрашивал о надежности на win7 или x64, я имел ввиду 1) cmd 2) del 3) Ну и еще синтаксис строчки кода на всякий случай ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2011, 01:11 |
|
|
start [/forum/topic.php?desktop=1&fid=60&tid=2158542]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 149ms |
0 / 0 |