Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Архивация вложенных каталогов через API, VS2008 Добавлено: 02.04.09 23:47  

Автор вопроса:  EatenUpInside | Web-сайт:  | ICQ:  
Доброй ночи!

Есть необходимость архивировать дерево каталогов без привлечения сторонних библиотек и компиляции чего-то готового на си шарп, например, во вложенном проекте.

Что не работает:

Dim App As New Object
App = CreateObject("Shell.Application")     App.NameSpace("c:\b.zip").CopyHere((App.NameSpace("C:\Folder").items))


отрабатывает, но ничего не делает; если убрать вторые скобки после CopyHere, то
Член группы не найден. (Исключение из HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND)).

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 EatenUpInside



ICQ:  

Вопросов: 5
Ответов: 9
 Web-сайт:
 Профиль | | #1
Добавлено: 02.04.09 23:50
Далее, пытаюсь создать в архиве папочку:
  1. App.NameSpace("c:\b.zip\").NewFolder("000")

получаю Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.

Единичный файл добавляется нормально, все пути существуют.

Что делать?

ЗЫ В 3,5 есть инструменты, я знаю, просто предел для проекта - 2.0. )))

Ответить

Номер ответа: 2
Автор ответа:
 EatenUpInside



ICQ:  

Вопросов: 5
Ответов: 9
 Web-сайт:
 Профиль | | #2
Добавлено: 05.04.09 19:09
Итак, отписываюсь о попытках подружить .net и COM:

  1. Function ZipFolder(ByVal FolderPath As String, ByVal ArchivePath As String) As String
  2.         Dim App As Object, ElemCount As Long
  3.         ArchivePath = CreateEmptyZip(ArchivePath)
  4.         App = CreateObject("Shell.Application")
  5.         ElemCount = App.namespace((ArchivePath)).items.count
  6.         App.NameSpace((ArchivePath)).CopyHere((App.namespace((FolderPath)).items))
  7.     End Function
  8.  
  9.     Function CreateEmptyZip(ByVal ArchivePath As String) As String
  10.         Const MyId = "CreateEmptyZip"
  11.         Dim ZipHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & StrDup(18, Chr(0))
  12.         Try
  13.             If ArchivePath = "" Then
  14.                 ArchivePath = Path.GetTempFileName()
  15.             Else
  16.                 If File.Exists(ArchivePath) = True Then
  17.                     ArchivePath = Path.GetTempFileName()
  18.                 End If
  19.             End If
  20.             If Path.GetExtension(ArchivePath) <> ".zip" Then
  21.                 ArchivePath = ArchivePath & ".zip"
  22.             End If
  23.             File.AppendAllText(ArchivePath, ZipHeader, System.Text.Encoding.ASCII)
  24.             Return ArchivePath
  25.         Catch ex As Exception
  26.         '
  27.         End Try
  28.     End Function


Работает, но, к сожалению, 1 раз из 20 или 30 - в остальных случаях создается пустой архив и все.
Пробовал ставить задержку в 3 секунды и просто прогонять на уже созданном руками архиве - картина одна и та же.
Да, не забывайте про двойные скобки вокруг некоторых аргументов (указание компилятору, что значение передается ByVal).

Коллеги, если я где-то явно лоханулся, не сочтите за труд отписаться здесь!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам