Что нового

Не все функции работают в _Zip.au3

winkot

Новичок
Сообщения
168
Репутация
0
Функции _Zip_AddItem _Zip_Create _Zip_UnzipAll прекрасно работают.

А _Zip_Coun _Zip_DeleteItem _Zip_ItemExists _Zip_List функции выдают ошибку. С чем это может быть связано?
 

Oki

Продвинутый
Сообщения
452
Репутация
62
В первой функции одна буковка пропущена, но вряд ли в этом была проблема.
Код:
_Zip_Count()
У меня компиляция слетает ещё на этапе первой строки.
Код:
#Include <_Zip.au3>
С только что обновлённой версией AutoIt то же самое. В текущем варианте русской справки подчёркивание для функции в include требуется, но без него тоже не работает. В английской справке вообще не упоминается Zip. Непонятно, где читать актуальную справку.
 
Последнее редактирование:
Автор
W

winkot

Новичок
Сообщения
168
Репутация
0
Дело в том, что это код прекрасно работает
Код:
#include <_Zip.au3>
$Zip = _Zip_Create(@ScriptDir & "\1.zip", 1)
$Zip=_Zip_AddItem(@ScriptDir & "\1.zip", @ScriptDir & "\Тест.txt")


А вот этот не работает.
Код:
#include <_Zip.au3>
$Zip = _Zip_DeleteItem(@ScriptDir & "\1.zip", @ScriptDir & "\Тест.txt")


Выдает ошибку 4 - ZIP file or sub path does not exist
Хотя файл существует. В чем же дело?

Аналогично не работает этот код. То же выдает ошибку 4.
Код:
#include <_Zip.au3>
$Zip=_Zip_ItemExists(@ScriptDir & "\1.zip", @ScriptDir & "\Тест.txt")


Хотя этот код работает.
Код:
#include <_Zip.au3>
$Zip = _Zip_Unzip(@ScriptDir & "\1.zip", "Тест.txt", @ScriptDir & "\Temp")


В чем проблема?
 
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
Оказывается, надо было самостоятельно скачать файл для #include, что не столь очевидно. Обычно стандартные файлы для #include встроены в пакет. Возможно, сигналом для этого являлось то, что имя файла начинается с подчёркивания? Хотелось бы, чтобы такие сигналы где-то явно описывались на видном месте, а не добывались за счёт опыта.
А вот этот не работает.
Код:
#include <_Zip.au3>
$Zip = _Zip_DeleteItem(@ScriptDir & "\1.zip", @ScriptDir & "\Тест.txt")
Этот же скрипт просто неправильно написан. Надо вот так.
Код:
#include <_Zip.au3>
$Zip = _Zip_DeleteItem(@ScriptDir & "\1.zip", "Тест.txt")
В справке это объясняется не очень удачно, надо догадываться, что имеется в виду.
 
Последнее редактирование:
Автор
W

winkot

Новичок
Сообщения
168
Репутация
0
Надо вот так.
Код:
#include <_Zip.au3>
$Zip = _Zip_DeleteItem(@ScriptDir & "\1.zip", "Тест.txt")
В справке это объясняется не очень удачно, надо догадываться, что имеется в виду.
Все равно не работает. Выдает ошибку 7 - Failed to delete item
 

Oki

Продвинутый
Сообщения
452
Репутация
62
У меня аналогичный тест сработал, и я теперь понимаю разницу. Всё дело в том, что не имею привычки в имена файлов и папок пихать неанглийские буквы. Именно из-за них не работает даже после исправления ошибки в синтаксисе функции. С английскими буквами всё работает.

А ведь ты параллельно в друго́м топике поднимал вопрос кириллицы в именах файлов в архивах. Похоже на то, что и здесь аналогичная проблема.

Тест с применением предложенной в том топике функции конвертации кодировок у меня тоже не сработал.
Код:
#include <_Zip.au3>
$iZip = _Zip_DeleteItem(_Encoding_ANSIToOEM(@ScriptDir & "\1.zip"), _Encoding_ANSIToOEM("Тест.txt"))
$iErr = @error
MsgBox(4096, "", $iZip & ", " & $iErr)
Func _Encoding_ANSIToOEM($sText)
    $sBuffer = DllStructCreate("char[" & StringLen($sText) + 1 & "]")
    $aRet = DllCall("User32.dll", "int", "CharToOem", "str", $sText, "ptr", DllStructGetPtr($sBuffer))
    If Not IsArray($aRet) Then
        Return SetError(1, 0, '')
    ElseIf $aRet[0] = 0 Then
        Return SetError(2, $aRet[0], '')
    Else
        Return DllStructGetData($sBuffer, 1)
    EndIf
EndFunc
Теперь выдаёт ошибку 5: "Элемент в ZIP-архиве не найден". Явно не желает дружить с кириллицей в именах. Может быть, как-то и можно справиться, но немного иначе. Мне больше по нраву было бы подумать, можно ли обойтись классическими символами в именах. Но сам по себе вопрос о том, как работать с другими символами в именах, сто́ящий в любом случае.

Также можно рассмотреть работу в режиме командной строки. Через AutoIt, разумеется.
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Системная библиотека zipfldr.dll работает в языковом интерфейсе системы. А он русскоязычный


проблема не в русскоязычном пути, а в том, что функция ищет английское слово "delete'
Код:
Func _Zip_DeleteItem($sZipFile, $sFileName)
    If Not _Zip_DllChk() Then Return SetError(@error, 0, 0)
    If Not _IsFullPath($sZipFile) Then Return SetError(3, 0, 0)
    ; parse filename
    Local $sPath = ""
    $sFileName = _Zip_PathStripSlash($sFileName)
    If StringInStr($sFileName, "\") Then
        ; subdirectory, parse out path and filename
        $sPath = _Zip_PathPathOnly($sFileName)
        $sFileName = _Zip_PathNameOnly($sFileName)
    EndIf
    Local $oNS = _Zip_GetNameSpace($sZipFile, $sPath)
    If Not IsObj($oNS) Then Return SetError(4, 0, 0)
    Local $oFolderItem = $oNS.ParseName($sFileName)
    If Not IsObj($oFolderItem) Then Return SetError(5, 0, 0)
    Local $oVerbs = $oFolderItem.Verbs()
    If Not IsObj($oVerbs) Then Return SetError(6, 0, 0)
    For $oVerb In $oVerbs
        If StringReplace($oVerb.Name, "&", "") = "delete" Then; вот в этой строке
            $oVerb.DoIt()
            If IsObj($oNS.ParseName($sFileName)) Then
                Return SetError(8, 0, 0)
            Else
                Return 1
            EndIf
        EndIf
    Next
    Return SetError(7, 0, 0)
EndFunc   ;==>_Zip_DeleteItem

значит в нашем случае строка должна выглядеть
Код:
StringReplace($oVerb.Name, "&", "") = "Удалить"

и всё работает. проверено
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Откуда такая информация?
Пользователь выбирает локальный язык. Соответственно, вся система работает на этом языке. Так сделали авторы системы.
Если бы у автора темы была англоязычная система, то вопросов не было бы
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Как только мне стало понятно, что дело может быть в языке, параллельно были протестированы два варианта. Когда в архиве удалялся файл с именем "test.txt", функция сработала, но с именем "тест.txt" она отказалась сотрудничать. Локальным языком прописан английский.
Сообщение автоматически объединено:

Таким образом, в англоязычной Windows файлы с англоязычными именами удаляются, а файлы с русскоязычными именами дают ошибку, что противоречит следующим заявлениям.
проблема не в русскоязычном пути
Если бы у автора темы была англоязычная система, то вопросов не было бы
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
проблема была не в кириллице, а в том, что функция ищет delete, но в русской локализации есть "удалить".
если локализация английская, но есть поддержка языков, то тут нужно смотреть что и как работает.
что там далее на уме у майкрософта я не знаю. Решаю попавшуюся проблему для конкретного случая.
если есть желание разобраться более, то нужно смотреть документацию по zipfldr
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Решаю попавшуюся проблему для конкретного случая.
Так вот же он конкретный случай: у меня удаляется файл с английским именем, а с русским не удаляется. Локализация английская, поэтому доводы насчёт "удалить" вместо "delete" непонятны.
Сообщение автоматически объединено:

Вопрос, кстати, непраздный: у меня как раз за пару дней до появления топиков об архивах был план заняться автоматизацией работы с архивами.
Сообщение автоматически объединено:

Пусть доводы и непонятны, но докладываю о том, что вариант исправить "delete" на "удалить" на всякий непонятный случай опробован. В результате ошибка 7.
Сообщение автоматически объединено:

Если же оставить "delete", то выскакивает по недокументированной в русской справке ошибке 8.
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
у меня нет под рукой английской локализации. Кстати, надо поставить виртуальную машину для тестов.
А пока ничего определенного про ваш случай сказать не могу. Я вообще встроенным архиватором не пользуюсь. Только 7z
Вопрос, кстати, непраздный: у меня как раз за пару дней до появления топиков об архивах был план заняться автоматизацией работы с архивами.
создавайте тему , будем обсуждать. для того и форум.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Другую тему создаём, когда вопрос другой, а здесь то же самое. Тема не раскрыта.

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