Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


irvicon, Вы писали: файлы ... немного отличаются по размеру 5-10КБ, при этом размер архивов должны быть по 7,5МБ+-1МБ.

Итак, возмём за основу размер архива, например, 7500 Кб, средний размер файла, например, 10 Кб и, определим опытным путём, процент сжатия файлов архиватором - например, 80%. По видимому, этот процент не сильно меняется для Вашего набора файлов, так как ИМХО, характеристики файлов от случая к случаю не сильно отличаются, скорее всего они создаются одним и тем же софтом для одних и тех же целей.

Посчитаем, сколько файлов надо заархивировать, чтобы приблизительно получить архив заданной величины.
Куда-нибудь, например, в папку для временных файлов, по очереди будем переписывать исходные файлы вычисленными порциями с сохранением структуры папок, архивировать порцию и затем удалять заархивированную копию.
Работает существенно быстрее, чем мой предыдущий вариант, но, естественно, размер архива будет намного сильнее отличаться от заданного. Но, ИМХО, Вам важно не превысить максимально-допустимый размер, что вполне достижимо
в приведенном коде.

Код: Выделить весь код
@Echo Off
cls 

Set /A SMax=7500
Set /A SAve=10
Set /A Perc=80

Set /A NIn=%SMax%*100/SAve/Perc

rem Set /A NIn=111

Set "DirIn=E:\Games"
Set "DirArc=E:\Delete"

Set ARC="C:\Program Files\WinRAR\Rar.exe" a -r

Set "NArc=%Date:~6,4%%Date:~3,2%%Date:~0,2%_Input" 

SetLocal EnableExtensions EnableDelayedExpansion

Call :OutTmp "%DirIn%"
cd /d "%Tmp%"

xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y  >nul

Set /A N=1
Set /A M=0

FOR /F "usebackq delims=" %%i IN (`dir "%DirIn%\" /b /A:-D /s 2^>nul`) DO (
	Call :OutTmp "%%i"
	Echo "%%i" 
	Copy "%%i" "!OTmp!" >nul
	Set /A M=!M!+1
	If !M! GEQ %NIn% (
		Call :OutTmp "%DirIn%"
		echo !M!  %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\"
		%ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\" >nul
		rd "%OTmp%" /s /q
		xcopy "%DirIn%\*.*" "%OTmp%\" /t /e /y >nul
		Set /A N=!N!+1
		Set /A M=0
	)  
)

If NOT !M!==0 (
	Call :OutTmp "%DirIn%"
	echo !M!  %ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\"
	%ARC% "%DirArc%\%NArc%!N!.rar" "!DTmp!\"  >nul
	rd "!OTmp!" /s /q
)

GoTo :Eof

:OutTmp
Set "DTmp=%~pnx1"
Set "DTmp=%DTmp:~1,999%"
Set "OTmp=%Tmp%%~pnx1"
GoTo :Eof

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 19-11-2015 в 22:15.


Отправлено: 19:55, 18-11-2015 | #6