Что нового

_Zip.au3 Подтверждение замены папки

gergerger111

Новичок
Сообщения
17
Репутация
0
По умолчанию не работают следующие флаги:
флаг 1 - Перезаписать файл в папке назначения, если он существует
флаг 8 - Переименовывает, если файл с таким именем уже существует

Добавление флагов в ручную, предоставление прав администратора = не помогло.

Код:
#include <_Zip.au3>

$sZipFile = FileOpenDialog("Выберите архив", "", "Архивы ZIP (*.zip)", 3)
If @error Then Exit

$sFolder = "D:\t1"
$sFolder2 = "D:\t2"
$iRes = _Zip_Unzip ($sZipFile, "t1", "D:\222_t1") ;по умолчанию не работают сделующие флаги:
                                                  ;флаг 1 - Перезаписать файл в папке назначения, если он существует
												  ;флаг 8 - Переименовывает, если файл с таким именем уже существует
If @error Then
	MsgBox(64, "_Zip_UnzipAll", "Ошибка @error = " & @error)
Else
	MsgBox(64, "_Zip_UnzipAll", "Успех: " & $iRes)
EndIf


Ответ на форуме не нашёл( Плохо искал ?
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Я может другую версию _Zip.au3 скачал, но в моей версии у функции _Zip_Unzip() флага 8 нет, а флаг 1 - не показывать прогресс.

Код:
;===============================================================================
;
; Function Name:    _Zip_Unzip()
; Description:      Extract a single file contained in a ZIP Archieve.
; Parameter(s):     $hZipFile - Complete path to zip file that will be created (or handle if existant)
;					$hFilename - Name of the element in the zip archive ex. "hello_world.txt"
;					$hDestPath - Complete path to where the files will be extracted
;					$flag = 1
;					- 1 no progress box
;					- 0 progress box
; Requirement(s):   none.
; Return Value(s):  On Success - 0
;                   On Failure - sets @error 1~3
;					@error = 1 no Zip file
;					@error = 2 no dll
;					@error = 3 dll isn't registered
; Author(s):        torels_
; Notes:			The return values will be given once the extracting process is ultimated... it takes some time with big files
;
;===============================================================================
Func _Zip_Unzip($hZipFile, $hFilename, $hDestPath, $flag = 1)
	Local $DLLChk = _Zip_DllChk()
	If $DLLChk <> 0 Then Return SetError($DLLChk, 0, 0) ;no dll
	If not _IsFullPath($hZipFile) then Return SetError(4,0) ;zip file isn't a full path
	If Not FileExists($hZipFile) Then Return SetError(1, 0, 0) ;no zip file
	If Not FileExists($hDestPath) Then DirCreate($hDestPath)
	$oApp = ObjCreate("Shell.Application")
	$hFolderitem = $oApp.NameSpace($hZipFile).Parsename($hFilename)
	$oApp.NameSpace($hDestPath).Copyhere($hFolderitem)
	While 1
		If $flag = 1 then _Hide()
		If FileExists($hDestPath & "\" & $hFilename) Then
			return SetError(0, 0, 1)
			ExitLoop
		EndIf
		Sleep(500)
	WEnd
EndFunc   ;==>_Zip_Unzip
 
Автор
G

gergerger111

Новичок
Сообщения
17
Репутация
0
hedji сказал(а):
Я может другую версию _Zip.au3 скачал, но в моей версии у функции _Zip_Unzip() флага 8 нет, а флаг 1 - не показывать прогресс.

Код:
;===============================================================================
;
; Function Name:    _Zip_Unzip()
; Description:      Extract a single file contained in a ZIP Archieve.
; Parameter(s):     $hZipFile - Complete path to zip file that will be created (or handle if existant)
;					$hFilename - Name of the element in the zip archive ex. "hello_world.txt"
;					$hDestPath - Complete path to where the files will be extracted
;					$flag = 1
;					- 1 no progress box
;					- 0 progress box
; Requirement(s):   none.
; Return Value(s):  On Success - 0
;                   On Failure - sets @error 1~3
;					@error = 1 no Zip file
;					@error = 2 no dll
;					@error = 3 dll isn't registered
; Author(s):        torels_
; Notes:			The return values will be given once the extracting process is ultimated... it takes some time with big files
;
;===============================================================================
Func _Zip_Unzip($hZipFile, $hFilename, $hDestPath, $flag = 1)
	Local $DLLChk = _Zip_DllChk()
	If $DLLChk <> 0 Then Return SetError($DLLChk, 0, 0) ;no dll
	If not _IsFullPath($hZipFile) then Return SetError(4,0) ;zip file isn't a full path
	If Not FileExists($hZipFile) Then Return SetError(1, 0, 0) ;no zip file
	If Not FileExists($hDestPath) Then DirCreate($hDestPath)
	$oApp = ObjCreate("Shell.Application")
	$hFolderitem = $oApp.NameSpace($hZipFile).Parsename($hFilename)
	$oApp.NameSpace($hDestPath).Copyhere($hFolderitem)
	While 1
		If $flag = 1 then _Hide()
		If FileExists($hDestPath & "\" & $hFilename) Then
			return SetError(0, 0, 1)
			ExitLoop
		EndIf
		Sleep(500)
	WEnd
EndFunc   ;==>_Zip_Unzip

Может тогда есть идеи ? как избавиться от этой проблемы ?
"Подтверждение замены папки"
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Предварительно удалить папку или файлы через
Код:
DirRemove()
FileDelete()

потом разархивировать
 
Автор
G

gergerger111

Новичок
Сообщения
17
Репутация
0
hedji сказал(а):
Предварительно удалить папку или файлы через
Код:
DirRemove()
FileDelete()

потом разархивировать

Жёсткие костыли учитывая, что я не донёс до вашего сведения еще 1 условие.
Внутри целевой папки в которую мы копируем файлы лежат файлы которые нельзя удалять (можно перезаписать).
И разархивироваться будут новые тхт файлы (повторяющиеся будут перезаписываться, с выводом сообщения да/нет)
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Варианты костылей, учитывая условие 1:
1) Разархивировать во временную папку, затем переносить через DirMove или FileMove, они как раз с опцией перезаписи
2) Ломать в самой функции _Zip_Unzip конструкцию
Код:
If FileExists($hDestPath & "\" & $hFilename) Then
            return SetError(0, 0, 1)
            ExitLoop
EndIf

чтобы была возможность перезаписи
 
Автор
G

gergerger111

Новичок
Сообщения
17
Репутация
0
gunter123 сказал(а):
Надо изменить строчку в функции _Zip_Unzip:
Код:
$oApp.NameSpace($hDestPath).Copyhere($hFolderitem, 16)

https://msdn.microsoft.com/en-us/library/windows/desktop/bb787866(v=vs.85).aspx

Вы про эти строки ? (вроде заменил строку на вашу , не помогло)
Код:
$oApp = ObjCreate("Shell.Application")
	$oApp.Namespace($hDestPath).CopyHere($oApp.Namespace($hZipFile).Items)
	For $item In $oApp.Namespace($hZipFile).Items
 

gunter123

Продвинутый
Сообщения
159
Репутация
69
Я скачал другую UDF, не могу найти вашу _Zip.au3
Можете скачать ее отсюда - https://www.autoitscript.com/forum/topic/73425-zipau3-udf-in-pure-autoit/ и в нее подставить ту строчку.
Или использовать вот такой код, без UDF:
Код:
$hZipFile = @ScriptDir & "\1.zip"         ; Путь к архиву
$hFileName = "1.txt"                      ; Название файла
$hDestPath = @ScriptDir                   ; Куда копируем

$oApp = ObjCreate("Shell.Application")
$hFolderitem = $oApp.NameSpace($hZipFile).Parsename($hFilename)
$oApp.NameSpace($hDestPath).Copyhere($hFolderitem, 16)

Или можете подставить вот такую строку в вашу UDF, но не уверен что сработает
Код:
$oApp.Namespace($hDestPath).CopyHere($oApp.Namespace($hZipFile).Items, 16)
 
Верх