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

  • Автор темы LIGHT
  • Дата начала
L

LIGHT

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

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

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

morpheus

LIGHT
а какаой рецептик? единственное с чем надо разобраться - это командную строку рара - как заархивировать выбранный файл в "тихом" режиме
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Вопрос: а нафига?

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

LIGHT

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

D!m@n

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

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

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

morpheus

а момент окончания архивации - сложно).
да собственно не сложно ... если заюзать WSH script (выполнить команду и дождатсья завершения) и написать чтото вроде ( C:\rar a 1.rar readme.rus.txt )
Код:
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 - шо архивировать ( лежит на диске С )
 
D

D!m@n

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

Kee_Keekkenen

не знал, использовал для этого винАПИ
 
M

morpheus

Kee_Keekkenen
достойный вариант... и будет работать точно в отличии от WSH у которого могут быть ограничения ( как у любого COM обьекта в лотусе )
 
N

nnikishi

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

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

morpheus

Kee_Keekkenen
Если не затруднит можно код?
 
O

Omh

Morpheus
Я за место него :)

Код:
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
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!