Что нового

Сортировка файлов по папкам

histodz

Новичок
Сообщения
2
Репутация
0
Привет.


С аутоит сталкивался пару раз. Были рабочие скрипты. Сам нифига не шарю. Но знаю что работает шустро. Поэтому решил тут попытать счастье.


Задача такая:

У меня есть папка с тысячами изображений.

Есть папка с папками - у каждой из которых уникальное название.

Мне надо в каждую папку поочередно загружать по 5 картинок. Грубо говоря 1000 картинок по 200 папкам по 5 штук. Цифры утрированные.


И потом ещё по 1 картинке из другой папке в каждую из этих папок добавить. Так же поочередно. Грубо говоря - могу делать 2 раза цикл. Просто к тому что цифры разные.


Пример:

У меня в первой папке 5000 картинок.
Во второй папке 1000 папок.
В третьей папке 1000 картинок.


5000 картинок поочередно добавляются в каждую из 1000 папок по 5 штук.

После этого. Я запускаю скрипт второй раз и уже добавляю из третьей папки по 1 картинке в каждую из вышеупомянутых папок.


По итогу у меня будет 1000 папок с пятью картинками из 1й папки и одной картинкой из 3й папки. В каждой из 1000 папок по 6 картинок.

Помогите пожалуйста это реализовать.
 

joiner

Модератор
Локальный модератор
Сообщения
3,460
Репутация
609
Привет.
Пример:

У меня в первой папке 5000 картинок.
Во второй папке 1000 папок.
В третьей папке 1000 картинок.
вариант
не проверял
Код:
#include <File.au3>

Local $Folder_5000pic = @ScriptDir & '\folder_5000pic'; папка 5000 картинок
Local $Folder_1000fr = @ScriptDir & '\folder_1000fr'; папка где 1000 папок
Local $Folder_1000pic = @ScriptDir & '\folder_1000pic'; папка 1000 картинок
Local $n = 1, $c = 0

Local $aFiles_5kp = _FileListToArray($Folder_5000pic, '*', 1)
Local $aFolder_1kfr = _FileListToArray($Folder_1000fr, '*', 2)
Local $aFiles_1kp = _FileListToArray($Folder_1000pic, '*', 1)

For $i = 1 To $aFolder_1kfr[0]
    If $n = $aFiles_5kp[0] + 1 Then ExitLoop
    For $k = $n To $aFiles_5kp[0]
        FileCopy($Folder_5000pic & '\' & $aFiles_5kp[$k], $Folder_1000fr & '\' & $aFolder_1kfr[$i] & '\' & $aFiles_5kp[$k])
        $n += 1
        $c += 1
        If $c = 5 Then
            FileCopy($Folder_1000pic & '\' & $aFiles_1kp[$i], $Folder_1000fr & '\' & $aFolder_1kfr[$i] & '\' & $aFiles_5kp[$k])
            $c = 0
            ExitLoop
        EndIf
    Next
Next
 
Последнее редактирование:
Автор
H

histodz

Новичок
Сообщения
2
Репутация
0
Привет.

вариант
не проверял
Код:
#include <File.au3>

Local $Folder_5000pic = @ScriptDir & '\folder_5000pic'; папка 5000 картинок
Local $Folder_1000fr = @ScriptDir & '\folder_1000fr'; папка где 1000 папок
Local $Folder_1000pic = @ScriptDir & '\folder_1000pic'; папка 1000 картинок
Local $n = 1, $c = 0

Local $aFiles_5kp = _FileListToArray($Folder_5000pic, '*', 1)
Local $aFolder_1kfr = _FileListToArray($Folder_1000fr, '*', 2)
Local $aFiles_1kp = _FileListToArray($Folder_1000pic, '*', 1)

For $i = 1 To $aFolder_1kfr[0]
    If $n = $aFiles_5kp[0] + 1 Then ExitLoop
    For $k = $n To $aFiles_5kp[0]
        FileCopy($Folder_5000pic & '\' & $aFiles_5kp[$k], $Folder_1000fr & '\' & $aFolder_1kfr[$i] & '\' & $aFiles_5kp[$k])
        $n += 1
        $c += 1
        If $c = 5 Then
            FileCopy($Folder_1000pic & '\' & $aFiles_1kp[$i], $Folder_1000fr & '\' & $aFolder_1kfr[$i] & '\' & $aFiles_5kp[$k])
            $c = 0
            ExitLoop
        EndIf
    Next
Next

Благодарю!
 

Oki

Знающий
Сообщения
148
Репутация
15
Элегантный выход при превышении размеров массива. Благодаря вам знаю на 1 знание больше.
Это не считается красивым кодингом. Классика предполагает попросту вместо предшествующего For-цикла использовать While-цикл с составным условием.
Код:
For $a = $b To $c
   If $d = $e Then ExitLoop
   ; вставить тело цикла
Next
Вместо кода вышеприведённого вида хорошим стилем считается следующий.
Код:
$a = $b
While $a <= $c And $d <> $e
   ; вставить тело цикла
   $a += 1
WEnd
 
Последнее редактирование:

Glass4217

Осваивающий
Сообщения
266
Репутация
48
Это не считается красивым кодингом. Классика предполагает попросту вместо предшествующего For-цикла использовать While-цикл с составным условием.
Если можно пример на пальцах пожалуйста. Сам я крайне медленно развиваюсь, буду крайне благодарен за урок.
 

AZJIO

Меценат
Меценат
Сообщения
2,791
Репутация
1,161
В смысле итерпретатор быстро выполняет скрипт? Если так, сведения неверные.
условие if как то измерял, в цикле, работает миллион раз в секунду. Здесь главный тормоз будет жёсткий диск. То есть из 2 секунд работы скрипта на код будет тратится 0,1 сек, а 1,9 на копирование, поэтому переписав на какой нибудь PureBasic с компилятором Си ниже 1,9 уйти не удастся, поэтому скорость будет по ощущениям одинакова. А если ещё и не учесть работы с переменными PureBasic, то неумеючи можно ухудшить результат. Мы там на PureBasic делали вывод Hex и я предложил метод ускорения, в итоге с 1600 мс довели до 5 мс, а потом до 1 мс, так что проблема скорости зависит от программиста.
 

Prog

Осваивающий
Сообщения
419
Репутация
48
условие if как то измерял, в цикле, работает миллион раз в секунду.
Недавно сравнивали https://autoit-script.ru/threads/gipoteza-kollatca-3n-1-uskorenie-vychislenij-resheno.28551

Здесь главный тормоз будет жёсткий диск.
Я имею в виду в целом производительность AutoIt, а не именно в этом случае.
Если бы исходник транслировался в байт-код и в таком виде интерпретировался, скорость работы была бы значительно выше чем сейчас.

Мы там на PureBasic делали вывод Hex и я предложил метод ускорения, в итоге с 1600 мс довели до 5 мс, а потом до 1 мс,
Оптимизация касалась строк? Других причин не вижу.
У AutoIt основное время тратится на анализ кода интерпретатором и ускорость можно за счет уменьшение длины имен функций, переменных и т. д. Но значительного прироста скорости все равно не будет.
 

AZJIO

Меценат
Меценат
Сообщения
2,791
Репутация
1,161
Prog
90% программ (а то и больше) не используют те математические вычисления что вы предложили, в большинстве автоматизация и разовые действия, которые выполняются даже глазом не успеешь моргнуть. В целом я слышал разницу скорости компилируемой программы от не компилируемой в 8 раз.
У AutoIt3 свои фишки. В PureBasic нет библиотеки экспорта реестра (позволяет выборочные ветки реестра в один рег-файл, например экспорт ассоциаций для моей программы), и некоторые функции WinAPI нельзя использовать в простом виде, требуется предварительное создание контента перед тем как отправить в функцию, а в AutoIt3 если уж функция написана, то она сделана в понятном формате, передал массив путей и получил что нужно, а не создавал структуру с массивом путей в Си формате пол-дня тестируя когда же она заработает.
В AutoIt3 очень удачно сделано в плане основных потребностей. Для начинающего всё есть в готовом виде. В PureBasic я пока собираю контент, чтобы также покрыть основные потребности.
Ну и если понадобиться скорость, вполне можно попросить на офсайте написать библиотеку dll на Си или ещё каком нибудь языке и вызывать как WinAPI. У меня было вычисление цвета между RGB и HSB в реальном времени (двигая один ползунок всё вычислялось в другой формат) и не было замедления ради которого бы я чего то просил.
 
Последнее редактирование:

Prog

Осваивающий
Сообщения
419
Репутация
48
В целом я слышал разницу скорости компилируемой программы от не компилируемой в 8 раз.
Это точно для AutoIt и с чем сравнивали?

У AutoIt3 свои фишки. В PureBasic нет библиотеки экспорта реестра
Это UDF, т. е. пользовательская библиотека. Ее можно написать практически на любом ЯП при необходимости.

и некоторые функции WinAPI нельзя использовать в простом виде, требуется предварительное создание контента перед тем как отправить в функцию, а в AutoIt3 если уж функция написана, то она сделана в понятном формате, передал массив путей и получил что нужно
В этом и проблема. В AutoIt WinAPI функции отличаются от оригинальных и описание с сайта майкрософта непосредственно неприменимо. Нужно искать различия для каждой функции в отдельности.

а не создавал структуру с массивом путей в Си формате пол-дня тестируя когда же она заработает.
Может в AutoIt это доставляет сложностей но в других ЯП с боле или менее вменяемым отладчиком, возможно по шагам выполнить код и посмотреть при вызове какой функции все идет не так как должно. Для дополнительных сведений можно вызвать GetLastError().
 

joiner

Модератор
Локальный модератор
Сообщения
3,460
Репутация
609
Друзья, пожалуйста, не разводите холивар в теме.
 
Верх