Что нового

[Файловая система] Эмуляция XCOPY в режиме обновления с помощью FileCopy()

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Подскажите, пожалуйста, как грамотно эмулировать копирование с обновлением XCOPY /D с помощью встроенной функции FileCopy()?

Подойдет вариант без указания даты...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
а запустить его в скрытом cmd-окне не подойдет?
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Kaster
Это философский вопрос... :smile:
Буду думать...

Конечно же, я хотел это сделать средствами AutoIt...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
а в чем заключается конечная цель?
посмотри в сторону DirCopy, если хочешь все подкаталоги тоже копировать
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Kaster
Я уже представил трудоемкость реализации этой задачи на "чистом" AutoIt и пришел к выводу, что подойдет и скрытое cmd-окошко с xcopy...
Подскажи, как это сделать?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
$p = 'Папка копирования'
$d = 'Папка назначения'
$keys = '/E /H'; Здесь следует указать все необходимые ключи
RunWait('xcopy "' & $p & '" "' & $d & '" ' & $keys, '', @SW_HIDE)
MsgBox(0, '', 'Done')
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Kaster
Простота реализации победила концепцию "чистоты"... :(

Спасибо, держи плюсик...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
ну если бы ты сказал в чем конечная цель, просто копирование, копирование по определенным условиям, копирование в назначенное время... можно было бы придумать и средствами Autoit.
а так, конечно сложно подсказать.
тем более средства для рекурсивной обработки папок есть. функции для проверки атрибутов и дат тоже есть.. так что... ;)
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Kaster
У меня есть флэшка, защищенная физически от записи...
На ней находится комплект DRWEB.5.0 для лечения:
*.vdb
drweb32.dll
drweb32w.exe
dwebllio.dll
ru-drweb.dwl
ну, и ключ, разумеется, тоже...
У меня есть зеркало DRWEB...
Раньше я копировал обновленные файлы с зеркала XCOPY с ключом /D...
Теперь хочу делать это с помощью скрипта AutoIt...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
[?]
snoitaleR сказал(а):
Раньше я копировал обновленные файлы с зеркала XCOPY с ключом /D...
С зеркала на сервера? xcopy насколько мне известно такое не умеет :smile:

Вобщем вот функция для копирования только новых файлов (ключ /D без указания даты):

Код:
;8 это чтобы создать папку если не существует, 1 это перезапись файлов
$iRet = _File_xCopy(@ScriptDir & "\Source", @ScriptDir & "\Dest", "(*.exe|*.vdb|*.dwl|*.dll)", "", 8+1, 1)

$iExtended = @extended
$iError = @error

MsgBox(64, "Results", StringFormat("ERROR:\t\t%i\nReturn:\t\t%i\nFiles Copied:\t%i", $iError, $iRet, $iExtended))

Func _File_xCopy($sSrc_Dir, $sDst_Dir, $sFile_Filter, $sFile_Prefix="", $iReplace=0, $iOnlyNew=0)
	If Not StringInStr(FileGetAttrib($sSrc_Dir), "D") Then Return SetError(1, 0, 0)
	
	Local $iRet_Extended = 0, $sRegExp_Filter, $hSearch, $sFile_Path, $sFile_Name
	Local $iSrc_FileTime, $iDst_FileTime
	
	$sSrc_Dir = StringRegExpReplace($sSrc_Dir, "\\+$", "")
	$sDst_Dir = StringRegExpReplace($sDst_Dir, "\\+$", "")
	
    $sRegExp_Filter = $sFile_Filter
    $sRegExp_Filter = StringReplace($sRegExp_Filter, ".", "\.")
    $sRegExp_Filter = "(?i)\A" & StringReplace($sRegExp_Filter, "*", ".*") & "\z"
    
    $hSearch = FileFindFirstFile($sSrc_Dir & "\*")
	
	While 1
        $sFile_Name = FileFindNextFile($hSearch)
        If @error Then ExitLoop
        
        $sFile_Path = $sSrc_Dir & "\" & $sFile_Name
		
        If StringInStr(FileGetAttrib($sFile_Path), "D") > 0 Then
			_File_xCopy($sFile_Path, $sDst_Dir & "\" & $sFile_Name, $sFile_Filter, $sFile_Prefix, $iReplace, $iOnlyNew)
			$iRet_Extended += @extended
		Else
			If StringRegExp($sFile_Name, $sRegExp_Filter) Then
				If $iOnlyNew = 1 Then
					$iSrc_FileTime = FileGetTime($sFile_Path, 0, 1)
					$iDst_FileTime = FileGetTime($sDst_Dir & "\" & $sFile_Prefix & $sFile_Name, 0, 1)
					
					If $iSrc_FileTime <= $iDst_FileTime Then ContinueLoop
				EndIf
				
				$iRet_Extended += FileCopy($sFile_Path, $sDst_Dir & "\" & $sFile_Prefix & $sFile_Name, $iReplace)
			EndIf
		EndIf
	WEnd
	
	Return SetExtended($iRet_Extended, FileClose($hSearch))
EndFunc
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
CreatoR сказал(а):
xcopy насколько мне известно такое не умеет
CreatoR
Помнишь мой скрипт для создания зеркала для DRWEB.5.0?
С помощью этого скрипта я создаю точную копию сервера обновления DRWEB на локальном диске...
Потом с этого зеркала обновляю установленный DRWEB и комплект для лечения вирусов на физически защищенной флэшке...

Роль XCOPY - копировать только новые и обновленные файлы баз, языкового и программных модулей для ремонтного комплекта...

Мне бы еще с твоим скриптом разобраться... :smile:
Я не силен в регулярных выражениях...


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

CreatoR
Супер! +1

Получилась полезняшка... :smile:
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
CreatoR
Для моего случая подходит идеально...
А для критически большого количества файлов призовем на помощь скрипт, который предложил Kaster... :smile:
 
Верх