Колекция -> Документ -> Выгрузить атачи -> Rar -> вернуть

Тема в разделе "Lotus - Программирование", создана пользователем LIGHT, 7 апр 2008.

  1. LIGHT

    LIGHT Гость

    У кого ни будь есть соображения как можно провернуть таку операцию.

    Взять коллекцию документов, а затем открываем каждый проверяем есть ли там атач(и) если есть скидываем их на диск, да не просто скидываем, а упаковываем в рар, из исходного дока удаляем атач(и) и ложим туда архив.

    Может есть рецептик, а то грустно как-то :)
     
  2. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    LIGHT
    а какаой рецептик? единственное с чем надо разобраться - это командную строку рара - как заархивировать выбранный файл в "тихом" режиме
     
  3. Medevic

    Medevic Что это ? :)
    Lotus team

    Регистрация:
    10 дек 2004
    Сообщения:
    3.346
    Симпатии:
    2
    Вопрос: а нафига?

    В смысле аттачи и так жмутся.
     
  4. LIGHT

    LIGHT Гость

    Не жмутся! Ну или крайне не эфективно.
    Например tiff 11м в базе, зарареный имеет 1м
    Компрессия в БД включена
     
  5. D!m@n

    D!m@n Гость

    По-моему, ее и отключить-то нельзя... ЕМНИП, можно только выбрать, использовать LZ1 или метод Хаффмана...

    Кстати, может быть полезно:
    При вызове рара через командную строку есть риск прикрепить к документу недопакованный архив (потому как отследить момент создания архива легко, а момент окончания архивации - сложно).
    Поэтому если будете пользоваться архиватором через командную строку - либо ставьте таймауты соответствующие (несколько десятков секунд), либо смотрите, готов ли архив по другим признакам.
    Критериями могут быть:
    - размер получившегося архива (например, если он меньше 1% от суммарного размера исходных файлов - значит явно битый)
    - наличие в папке временного(ых) файла(ов) (если архиватор в процессе работы создает таковые).
    М.б. имеет смысл поискать архиватор, который в процессе работы сначала создает временный файлик с архивом, а потом его переименовывает.

    Извините, если информация оказалась бесполезной :)
     
  6. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    да собственно не сложно ... если заюзать WSH script (выполнить команду и дождатсья завершения) и написать чтото вроде ( C:\rar a 1.rar readme.rus.txt )
    Код (Text):
    Set WShell = CreateObject("WScript.Shell")
    ReturnCode = WShell.Run("C:\rar.exe a C:\1.rar C:\readme.rus.txt", 1, True)
    Msgbox "заархивировали"
    где
    C:\rar - путь к архиватору
    а - заархивировать ( самая простая команда )
    1.rar - результирующий файл ( лежит на диске С )
    readme.rus.txt - шо архивировать ( лежит на диске С )
     
  7. D!m@n

    D!m@n Гость

    2Morpheus: Очень полезная штука!
    Только что переписал один старый скрипт с ее использованием - красота!
    +1
     
  8. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    не знал, использовал для этого винАПИ
     
  9. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Kee_Keekkenen
    достойный вариант... и будет работать точно в отличии от WSH у которого могут быть ограничения ( как у любого COM обьекта в лотусе )
     
  10. nnikishi

    nnikishi Гость

    Если кому интересно, есть платная утилитка ZipMail for Lotus Notes, написана на С++, есть как вариант как для клиента - когда пользователь приатачивает файл, файлик тихо конвертируется в zip и только потом приатачивается, иконка остается родная, например ворда, при открытии происходит обратное, простой пользователь может даже не понять, что файлик подкладывается на архив); Есть версия для Domino, добавляется в тасках, перелопачивает уже готовые базы и заменяет файлики на архивы. Вообще утилитка сделана очень аккуратно, но, лично мне непонятно зачем все это, тестировали на разных базах с разными вложениями, встроенный LZ1 уступает zip/rar всего 10-15%.

    /Moderated by Morpheus/ Убрал открытую рекламу
     
  11. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Kee_Keekkenen
    Если не затруднит можно код?
     
  12. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Morpheus
    Я за место него :)

    Код (Text):
    Public Const NORMAL_PRIORITY_CLASS = &H20&
    Public Const INFINITE = -1&

    Public Type STARTUPINFO
    cb As Long
    lpReserved As String
    lpDesktop As String
    lpTitle As String
    dwX As Long
    dwY As Long
    dwXSize As Long
    dwYSize As Long
    dwXCountChars As Long
    dwYCountChars As Long
    dwFillAttribute As Long
    dwFlags As Long
    wShowWindow As Integer
    cbReserved2 As Integer
    lpReserved2 As Long
    hStdInput As Long
    hStdOutput As Long
    hStdError As Long
    End Type

    Public Type PROCESS_INFORMATION
    hProcess As Long
    hThread As Long
    dwProcessID As Long
    dwThreadID As Long
    End Type

    Declare Function WaitForSingleObject Lib "kernel32" (_
    Byval hHandle As Long, _
    Byval dwMilliseconds As Long) As Long

    Declare Function CreateProcessA Lib "kernel32" (_
    Byval lpApplicationName As Long, _
    Byval lpCommandLine As String, _
    Byval lpProcessAttributes As Long, _
    Byval lpThreadAttributes As Long, _
    Byval bInheritHandles As Long, _
    Byval dwCreationFlags As Long, _
    Byval lpEnvironment As Long, _
    Byval lpCurrentDirectory As Long, _
    lpStartupInfo As STARTUPINFO, _
    lpProcessInformation As PROCESS_INFORMATION) As Long

    Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (_
    Byval hwnd As Long, _
    Byval lpOperation As String, _
    Byval lpFile As String, _
    Byval lpParameters As String, _
    Byval lpDirectory As String, _
    Byval nShowCmd As Long ) As Long

    Declare Function CloseHandle Lib "kernel32" (Byval hObject As Long) As Long
    Dim RetVal As Long
    Dim proc As PROCESS_INFORMATION
    Dim StartInf As STARTUPINFO

    Private Function ShellAndWait(Byval RunProg As String) As Long
    StartInf.cb = Len(StartInf)
    StartInf.wShowWindow = 0&

    RetVal = CreateProcessA(0&, RunProg, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, StartInf, proc)

    RetVal = WaitForSingleObject(proc.hProcess, INFINITE)
    RetVal = CloseHandle(proc.hProcess)

    ShellAndWait = RetVal
    End Function

    Function RunExternalProgram(CmdLine As String) As Boolean
    On Error Goto Errh

    If CmdLine = "" Then Exit Function

    Dim Result As Long
    Result = ShellAndWait(CmdLine)

    RunExternalProgram = True

    Exit Function
    Errh:
    Exit Function
    End Function
     
  13. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    Omh
    ну щас оформим в CodeBAse
     
Загрузка...

Поделиться этой страницей