Что нового

7za - вывести список файлов архива

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Использую ключ "L", получаю список, в котором и файлы и папки. Нужны только файлы любых расширений и без
В справке не нашел ответа.
или вариант только один - обрабатывать список?
 
Автор
joiner

joiner

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

Cytrus

Новичок
Сообщения
110
Репутация
3
Пример из справки работает же.

Есть маска.

Код:
$tINDIVIDUALINFO = _7ZipFindFirst($hArc, "*")
$tINDIVIDUALINFO = _7ZipFindFirst($hArc, "*.*")
$tINDIVIDUALINFO = _7ZipFindFirst($hArc, "*.txt")
$tINDIVIDUALINFO = _7ZipFindFirst($hArc, "*.exe")


Есть атрибуты.

Если атрибут не равер 0x10, то значит файл.

Код:
#include <Date.au3>
#include <7Zip.au3>

$ArcFile = FileOpenDialog("Выберите архив", "", "Архивы (*.7z;*.zip;*.gzip;*.bzip2;*.tar)")
If @error Then Exit

$hArc = _7ZipOpenArchive(0, $ArcFile)
If $hArc = 0 Then Exit MsgBox(16, "_7ZipOpenArchive", "Ошибка")

$tINDIVIDUALINFO = _7ZipFindFirst($hArc, "*")
If $tINDIVIDUALINFO = -1 Then Exit

;Use functions to obtain files values
ConsoleWrite("!> FileName: " & _7ZipGetFileName($hArc) & @LF & _
             "OriginalSize: " & _7ZipGetArcOriginalSize($hArc) & @LF & _
             "CompressedSize: " & _7ZipGetArcCompressedSize($hArc) & @LF & _
             "ArcRatio: " & _7ZipGetArcRatio($hArc) & @LF & _
             "Date: " & _Date_Time_DOSDateToStr(_7ZipGetDate($hArc)) & @LF & _
             "Time: " & _Date_Time_DOSTimeToStr(_7ZipGetTime($hArc)) & @LF & _
             "CRC: " & _7ZipGetCRC($hArc) & @LF & _
             "Attribute: " & _7ZipGetAttribute($hArc) & @LF & _
             "Method: " & _7ZipGetMethod($hArc) & @LF & @LF)

;Or retrieve values from structure (the fast method)
While 1
    $tINDIVIDUALINFO = _7ZipFindNext($hArc, $tINDIVIDUALINFO)
    If $tINDIVIDUALINFO = 0 Then ExitLoop
    
    ConsoleWrite("!> FileName: " & DllStructGetData($tINDIVIDUALINFO, "szFileName") & @LF & _
                 "OriginalSize: " & DllStructGetData($tINDIVIDUALINFO, "dwOriginalSize") & @LF & _
                 "CompressedSize: " & DllStructGetData($tINDIVIDUALINFO, "dwCompressedSize") & @LF & _
                 "CRC: " & DllStructGetData($tINDIVIDUALINFO, "dwCRC") & @LF & _
                 "Flag: " & DllStructGetData($tINDIVIDUALINFO, "uFlag") & @LF & _
                 "OSType: " & DllStructGetData($tINDIVIDUALINFO, "uOSType") & @LF & _
                 "Ratio: " & DllStructGetData($tINDIVIDUALINFO, "wRatio") & @LF & _
                 "Date: " & _Date_Time_DOSDateToStr(DllStructGetData($tINDIVIDUALINFO, "wDate")) & @LF & _
                 "Time: " & _Date_Time_DOSTimeToStr(DllStructGetData($tINDIVIDUALINFO, "wTime")) & @LF & _
                 "Attribute: " & DllStructGetData($tINDIVIDUALINFO, "szAttribute") & @LF & @LF)
WEnd

_7ZipCloseArchive($hArc)
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Cytrus
ты не понял ))
я использую консольную версию 7za.exe
есть ключ L для выведения списка файлов архива в консоль. но выводит и список папок. думал, что есть добавочный аргумент для вывода только файлов, но в справке не нашел. в принципе, я уж написал обработку строк консоли, чтобы остались только файлы. но вдруг я в справке что-то не увидел, вот и спрашиваю
 

Cytrus

Новичок
Сообщения
110
Репутация
3
Понял.

Без относительных путей невозможно вывести файлы.

Если только без рекурсии. Т.е., если они в корне архива.

С маской можно вывести рекурсионно все соответствующие типы файлов.
Но с относительными путями.

Это же не Total Commander, где можно вывести в панель все файлы, без подкаталогов.

Но вполне можно вывести рекурсионно абсолютно все файлы.
Но с относительными путями.
Папки не будут выводиться.

MyFolder\Document.txt - будет выводиться

MyFolder\ - не будет выводиться.
 
Автор
joiner

joiner

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


Добавлено:
Сообщение автоматически объединено:

Файлы, естественно, нужны с путями как в архиве


Добавлено:
Сообщение автоматически объединено:

на ru-board задал вопрос. ответ ниже
7za.exe l name.7z -ba -ir!*|findstr /c:"....A"
как я и предполагал, нужно самому обрабатывать полученные данные. в примере вызывается системная утилита.
 

Cytrus

Новичок
Сообщения
110
Репутация
3
Да, справка там написана замудрённо.

Ну вот, берёте параметры, в которых устанавливаете ключи и маски.

Код:
;Вывести все файлы и папки.
7z.exe l C:\Temp\Archive.7z -r

;Вывести только файлы
7z.exe l C:\Temp\Archive.7z *.* -r

;Вывести только папки
7z.exe l C:\Temp\Archive.7z -x!*.* -r

;Вывести только *.txt
7z.exe l C:\Temp\Archive.7z *.txt -r
 
Автор
joiner

joiner

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


я решил свой вопрос. в регулярке я не силен, поэтому сделал так
Код:
#include <array.au3>

$Pid = Run('7za.exe L -slt -ba -ir!* 52991.7z -ai!45800.7z -ai!23230.7z', '', @SW_HIDE, 0x8)
Local $Read, $tmp
While Sleep(10)
	$Read = StdoutRead($Pid)
	If @error Then ExitLoop
	If $Read <> '' Then $tmp &= $Read
WEnd

Local $astr, $array[0]
If $tmp Then
	$astr = StringSplit($tmp, @LF)
	For $i = 1 To $astr[0]
		If StringInStr($astr[$i], 'Attributes = A') Then _ArrayAdd($array, StringReplace($astr[$i - 4], 'Path = ', ''))
	Next
	_ArrayDisplay($array); Выводит список всех файлов из трех архивов с относительными путями
EndIf
 
Верх