Что нового

Помогите создать правильный цикл

AlexTurist

Новичок
Сообщения
13
Репутация
1
Здравствуйте. Помогите пожалуйста разобраться, а то я запутался совсем. Имеется папка с фаилами мне необходимо из этой папки найти все файлы с расширением *.img, далее с мне нужно что бы скрипт мерил вес каждого фаила и когда он доходит до нужного мне веса (который я задаю сам руками) записывает это в bat фаил, например у меня лежит 1000 фаилов img весом от 20 мб до 200 мб мне нужно что бы их общий вес был не больше 1500 мб (в примере ниже указан вес 25912255кб т.к. для теста были взяты мелкие фаилы) и это записалось в *.bat фаил с определенными параметрами (они почти одинаковые), потом он мерит следующие фаилы и записывает в этот же фаил на новую строчку следующий список и так пока не закончатся все фаилы. Вот что мне удалось сделать и как я планировал: с помощью функции
Код:
Func _FindFiles($sRoot, $sFile)

    Local $FileList

    $FileList = _FileListToArray($sRoot, $sFile, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
            ConsoleWrite($sRoot & '\' & $FileList[$i] & @CR)
        Next
    EndIf
    Return $FileList
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf

EndFunc

я собираю *.img фаилы в массив, затем я написал функцию которая мерит каждый фаил и плюсует их вес и в качестве ответа возвращает сколько фаилов в сумме дают нужный мне вес (заданный в функции)
Код:
Func _SizeArray ($MaxSize, $array, $NumberArray)
        Local $counter = 0
        Local $TempSize = 0
        For $i = $NumberArray To $array[0] Step 1
            $TempSize = $TempSize+FileGetSize ($array[$i])
            $counter = $counter + 1
            If $TempSize > $MaxSize Then
                $TempSize = $TempSize - FileGetSize ($array[$i])
                $counter = $counter - 1
                ExitLoop
            EndIf
        Next
        Return $counter
EndFunc

Затем функцию которая записывает это в *.bat фаил
Код:
Func _write_bat ($array_map, $Start, $End, $NameMap, $NumberGMAPsupp)
    FileWrite ( "1.bat", "gmt -j -o gmapsup" & $NumberGMAPsupp & ".img ")
    For $i = $start  To $End Step 1
        FileWrite ( "1.bat", $array_map[$i] & " ")
    Next
    FileWrite ( "1.bat", " -m " & $NameMap & @crlf)
EndFunc

дальше идея была в том что бы смотреть какой длинны вышел массив и и на его основе создать нужное количество циклов, но для теста сделал только 4 итерации, в итоге весь код выглядит так:
Код:
#Include <File.au3>
#include <Array.au3>
$TempCounterArray = 0
Global $NumberGMAPsupp = 0
Global $FileList
$NameMap = '"Ya kakaya to karta"'
$start = 1
$StartArray = 1
$array_answer = _FindFiles(@ScriptDir, '*.img')
For $X = 0 to 4 Step 1
    $Quantity_File_In_Array = _SizeArray (25912255, $array_answer, $StartArray) ; $StartArray - c какого массива начать, возвращаем количество файлов до указанного размера
        _write_bat ($array_answer, $StartArray, $Quantity_File_In_Array, $NameMap, $NumberGMAPsupp)
        $NumberGMAPsupp = $NumberGMAPsupp + 1
        $StartArray = $StartArray + $Quantity_File_In_Array
Next
Func _write_bat ($array_map, $Start, $End, $NameMap, $NumberGMAPsupp)
    FileWrite ( "1.bat", "gmt -j -o gmapsup" & $NumberGMAPsupp & ".img ")
    For $i = $start  To $End Step 1
        FileWrite ( "1.bat", $array_map[$i] & " ")
    Next
    FileWrite ( "1.bat", " -m " & $NameMap & @crlf)
EndFunc

Func _SizeArray ($MaxSize, $array, $NumberArray)
        Local $counter = 0
        Local $TempSize = 0
        For $i = $NumberArray To $array[0] Step 1
            $TempSize = $TempSize+FileGetSize ($array[$i])
            $counter = $counter + 1
            If $TempSize > $MaxSize Then
                $TempSize = $TempSize - FileGetSize ($array[$i])
                $counter = $counter - 1
                ExitLoop
            EndIf
        Next
        Return $counter
EndFunc
  

Func _FindFiles($sRoot, $sFile)

    Local $FileList

    $FileList = _FileListToArray($sRoot, $sFile, 1)
    If Not @error Then
        For $i = 1 To $FileList[0]
            ConsoleWrite($sRoot & '\' & $FileList[$i] & @CR)
        Next
    EndIf
    Return $FileList
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf

EndFunc
И в bat фаиле получается
gmt -j -o gmapsup0.img 37500000.img 37500001.img -m "Ya kakaya to karta"
gmt -j -o gmapsup1.img 37500002.img 37500003.img 37500004.img 37500005.img 37500006.img -m "Ya kakaya to karta"
gmt -j -o gmapsup2.img 37500011.img 37500026.img 37500027.img -m "Ya kakaya to karta"
gmt -j -o gmapsup3.img -m "Ya kakaya to karta"
gmt -j -o gmapsup4.img -m "Ya kakaya to karta"
а учитывая вес каждого img в тестовой сборке (во вложении скриншот с названиями и весом фаилов ) должно быть так:
gmt -j -o gmapsup0.img 37500000.img 37500001.img -m "Ya kakaya to karta"
gmt -j -o gmapsup1.img 37500002.img 37500003.img 37500004.img 37500005.img 37500006.img 37500007.img 37500008.img -m "Ya kakaya to karta"
gmt -j -o gmapsup2.img 37500011.img 37500026.img 37500027.img 37500028.img 37500029.img 37500030.img 37500031.img 37500032.img 37500033.img 37500034.img 37500035.img 37500036.img -m "Ya kakaya to karta"
gmt -j -o gmapsup3.img 37500037.img 37500038.img 37500039.img 37500040.img -m "Ya kakaya to karta"
gmt -j -o gmapsup4.img -m "Ya kakaya to karta"
В идеале последней строчки gmt -j -o gmapsup4.img -m "Ya kakaya to karta" не надо. И вот сижу и не понимаю как это зациклить так что бы он выдал нужный мне результат. Извиняюсь если написал сумбурно, старался расписать все по полочкам
Сообщение автоматически объединено:
 

Вложения

  • 2023-10-18_11-15-59.png
    2023-10-18_11-15-59.png
    76.2 КБ · Просмотры: 5

Alecsis

Осваивающий
Сообщения
97
Репутация
40
Здравствуйте!
Наклепал «на табуретке» нечто по мотивам Ваших изысканий. В принципе похоже на то, что надо. Конечно, скрипт ещё пилить и пилить, чтобы довести до ума.
 

Вложения

  • AlexT1.rar
    4.9 КБ · Просмотры: 2
Автор
A

AlexTurist

Новичок
Сообщения
13
Репутация
1
Здравствуйте!
Наклепал «на табуретке» нечто по мотивам Ваших изысканий. В принципе похоже на то, что надо. Конечно, скрипт ещё пилить и пилить, чтобы довести до ума.
Сейчас попробовал увеличить лимит (я так понимаю он указан в переменной $ciMaximum) до 4 Гб (с округлением 4000000 прописал в переменную), вес фаилов от 12 мб до 300 мб, количество 2270 и скрипт в батнике прописал почему то по 1 фаилу (максимум 2) в каждой строчке, т.е. батник сейчас выглядит так:
@echo off
chcp 1251 >nul
gmt -j -o gmapsup0.img yamal_all_yandex_sattelite_z17_1-44.img -m "Ya kakaya-to karta"
gmt -j -o gmapsup1.img yamal_all_yandex_sattelite_z17_1-45.img -m "Ya kakaya-to karta"
gmt -j -o gmapsup2.img yamal_all_yandex_sattelite_z17_1-46.img -m "Ya kakaya-to karta"
gmt -j -o gmapsup3.img yamal_all_yandex_sattelite_z17_1-47.img yamal_all_yandex_sattelite_z17_10-27.img -m "Ya kakaya-to karta"
Я что то неправильно отредактировал?
PS
Вложил фаил Bat переименовав в txt т.к. не прикреплялся
 

Вложения

  • AlexT1.txt
    206.4 КБ · Просмотры: 1
Последнее редактирование:

Alecsis

Осваивающий
Сообщения
97
Репутация
40
Сейчас попробовал увеличить лимит (я так понимаю он указан в переменной $ciMaximum) до 4 Гб (с округлением 4000000 прописал в переменную), вес фаилов от 12 мб до 300 мб, количество 2270 и скрипт в батнике прописал почему то по 1 фаилу (максимум 2) в каждой строчкеkarta"[/SPOILER]
Я что то неправильно отредактировал?
PS
Вложил фаил Bat переименовав в txt т.к. не прикреплялся
Привет! А можно взглянуть на реальный список файлов *.img по возможности не картинкой, а в текстовом виде?
Например, выдачу dir *.img >qwerty.txt (для чистоты эксперимента)
PS1 В _FindFiles() исправлена «спящая» ошибка
PS2 М.б. заодно перейти в личку, чтобы не загромождать тему?
PS3 Upd: чуть не забыл, прописать в $ciMax тогда уж не 4000000 (4 миллиона), а 4000000000 (4 миллиарда), ибо подсчёт веса картинок идёт в байтах
(по всё видимости «что-то не так» именно здесь). Это как раз к вопросу о «что тут пилить?» :acute:
 

Вложения

  • AlexT1-1.rar
    4.8 КБ · Просмотры: 1
Последнее редактирование:
Верх