Что нового

Фильтр копирования

Orus

Чайник
Сообщения
41
Репутация
1
Возможно ли копируя всю папку отслеживать какие файлы копируются и запрещать копирование некоторых (например *.exe, *.suo) ?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Если копируется только содержимое одной папки без вложенных папок, то можно простым перебором копировать только те файлы которые не соответствуют фильтру.
если же подкаталоги тоже надо копировать, то в целях быстродействия лучше вызывать xcopy в скрытом окне cmd. ну или рекурсивно производить вышеуказанную операцию. но при большом кол-ве файлов проигрыш в скорости перед xcopy будет очень ощутимой
 
Автор
O

Orus

Чайник
Сообщения
41
Репутация
1
а если всеже использовать autoit, то создавать деревья на все папки и их копировать?
З.Ы. размер, по идее, не должен привышать 25мб. и сразу по этому поводу вопрос: функция DirGetSize, я сравнивал значение, которое она возвращает в байтах, я пробовал любые значени точные, не точные со знаком больше меньше, не выдает результат. мб есть какие особенности использования?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Orus [?]
а если всеже использовать autoit, то создавать деревья на все папки и их копировать?
при соответствующем флаге у FileCopy - структуру сама создастся.

З.Ы. размер, по идее, не должен привышать 25мб
главное не размер, а кол-во файлов.
функция DirGetSize, я сравнивал значение, которое она возвращает в байтах, я пробовал любые значени точные, не точные со знаком больше меньше, не выдает результат. мб есть какие особенности использования?
чесгря, не понял.
Код:
DirGetSize(path)

проста как две копейки. Если путь до файла папки правильный, то возвращает в точности размер файла папки в байтах. не понимаю, какие больше и меньше?
приведи код и скажи что не работает
 
Автор
O

Orus

Чайник
Сообщения
41
Репутация
1
Код:
If DirGetSize("G:\Ideal'nyj.virus.2009.P.DVDRip.740.avi") = 781537280 Then
	MsgBox(4096,"","745Mb")
Else
	MsgBox(4096,"","Else")
EndIf

так выдает Elsse
Код:
If DirGetSize("G:\Ideal'nyj.virus.2009.P.DVDRip.740.avi") > 781537000 Then
	MsgBox(4096,"","745Mb")
Else
	MsgBox(4096,"","Else")
EndIf

и так тоже Else, мб что не правильно пишу?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
извини, Orus. это я ошибся. в голове одно, а на деле другое :smile: свой пост поправил
DirGetSize - возвращает размер папки, а не файла. если нужно именно файла, то используй
Код:
FileGetSize(path)
 
Автор
O

Orus

Чайник
Сообщения
41
Репутация
1
да я тож ступил :smile:
По поводу FileCopy, если я напишу FileCopy("C:\*.au3", "D:\mydir\", 9) то это будут копировться все файлы *.au3, а возможно ли записать, чтобы копировались все кроме *.au3?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Нет. непосредственно такое сделать нельзя. Но можно написать самому. Через перечисление всех файлов. Можно даже рекурсивно для обработки всех подкаталогов. К сожалению сейчас временем не располагаю. Но в принципе - задача не сложная.
 
Автор
O

Orus

Чайник
Сообщения
41
Репутация
1
я вот подумал, а если сначала скопировать все что есть, а потом удалять все не нужные файлы, вот сейчас думаю над тем, как перебрать все имеющиеся подкаталоги...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Вот набросал самый топорный вариант. Только для демонстрации рекурсии и пофайловой обработки папок и подпапок
Код:
#include <File.au3>
$src = FileSelectFolder('Please, choose folder to copy', '', 1 + 2 + 4, 'd:\prog\test\')
If @error Then Exit
$dest = FileSelectFolder('Please, choose folder to paste', '', 1 + 2 + 4, 'd:\prog\test\')
If @error Then Exit
$filter = 'exe|suo'; any other file extensions to be excluded from copy list separated by pipe "|"
_Copy($src, $dest, $filter)

Func _Copy($source, $destination, $filter = 'exe|vb|suo')
	MsgBox(0, '', $source & @CRLF & $destination)
	$aFolders = _FileListToArray($source, '*', 2); Folders
	$aFiles = _FileListToArray($source, '*', 1); Files
	If Not IsArray($aFolders) AND Not IsArray($aFiles) Then Return ''; No files or fodlers found in source path
	For $j = 1 to $aFiles[0]
		$ext = _ExtDefine($aFiles[$j])
		If Not StringInStr($filter, $ext) Then FileCopy($source & '\' & $aFiles[$j], $destination & '\' & $aFiles[$j], 8)
	Next
	For $i = 1 to $aFolders[0]
		$new_source = $source & '\' & $aFolders[$i]
		$new_dest = $destination & '\' & $aFolders[$i]
		_Copy($new_source, $new_dest, $filter); Recursive processing for subfolders
	Next
EndFunc

;;; Function for determination of file extension 
Func _ExtDefine($file)
	If StringInStr($file, '\') Then
		$aFile = StringSplit($file, '\')
		$file = $aFile[$aFile[0]]
	EndIf
	If Not StringInStr($file, '.') Then Return ''
	$aFile = StringSplit($file, '.')
	Return $aFile[$aFile[0]]
EndFunc


копирует исключительно одну выбранную папку с файлами и подпапками в выбранную папку исключая файлы с расширением заданным в переменной $filter.
Структура подпапок воспроизводится как у родительского при наличии соответствующих прав
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 160
Репутация
2 329
Ещё один метод - _File_xCopy:

Код:
;8 это чтобы создать папку если не существует, 1 это перезапись файлов
;Последняя 1-ца определяет исключение для фильтра ($sFile_Filter), иначе будет производиться поиск по заданному фильтру
$iRet = _File_xCopy("C:\Src", "C:\Dst", "(*.exe|*.suo)$", "", 8+1, 0, 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, $iExclIncl_Mode=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, $iExclIncl_Mode)
			$iRet_Extended += @extended
		Else
			If ($iExclIncl_Mode = 0 And StringRegExp($sFile_Name, $sRegExp_Filter)) Or _
				($iExclIncl_Mode = 1 And Not 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
 
Автор
O

Orus

Чайник
Сообщения
41
Репутация
1
Спасибо Kaster и CreatoR :smile:
 
Верх