Что нового

не нужная вставка Enter в функцию _FO_FileSearch()

La2Angel

Новичок
Сообщения
156
Репутация
1
Доброе, кто-то сталкивался с тем, что при выводе массива функции _FO_FileSearch, в массиве отображает все нормально, хотел сделать FileMove, но не перемещает, разобрался почему, данная функция вставляет после поиска файлов Enter, соответственно FileMove не может найти уже файл.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Потому что функция писалась для версии 3.3.8.1, когда флаги регулярных выражений были другими. Мне лень переписывать под новую версию AutoIt3. Кажется что легко, но методом быстрого исправления не получилось. Теоретически надо задать флаги CFLF, так чтобы они соответствовали старой версии, для всех регулярных выражений.
Грубо говоря в старой версии перенос является CFLF, а в новой версии любой из CF или LF. Так как он находит в конце 2 символа, а как разделитель использует один символ, то второй идёт в результаты, то есть в строку пути.

History
  • Changed: Default newline character for PCRE regexes changed to ANYCRLF.

Кстати какая у вас версия AutoIt3? Пробую 3.3.16.0 и возвращает массив без лишних символов, может я чего не понимаю?
 
Последнее редактирование:
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Потому что функция писалась для версии 3.3.8.1, когда флаги регулярных выражений были другими. Мне лень переписывать под новую версию AutoIt3. Кажется что легко, но методом быстрого исправления не получилось. Теоретически надо задать флаги CFLF, так чтобы они соответствовали старой версии, для всех регулярных выражений.
Грубо говоря в старой версии перенос является CFLF, а в новой версии любой из CF или LF. Так как он находит в конце 2 символа, а как разделитель использует один символ, то второй идёт в результаты, то есть в строку пути.

History
  • Changed: Default newline character for PCRE regexes changed to ANYCRLF.

Кстати какая у вас версия AutoIt3? Пробую 3.3.16.0 и возвращает массив без лишних символов, может я чего не понимаю?
Версия та же 3.3.16.0. Вот так выводит сам массив, там ни чего не видно подобия CR и прочего. В блокнот сохраняет вот так:
\ConvertImg\img\img-00001-00001.bmp \ConvertImg\img\ img-00001-00002.bmp \ConvertImg\img\ img-00001-00003.bmp \ConvertImg\img\ img-00001-00004.bmp \ConvertImg\img\ img-00001-00005.bmp \ConvertImg\img\ img-00001-00006.bmp \ConvertImg\img\ img-00001-00007.bmp \ConvertImg\img\ img-00001-00008.bmp

Т.е. переносит имя файла, а не в одну строку, как самый первый файл. Начинается такое со второго файла в массиве.
Я конечно сделал вставку, которая помогает, просто спросил на всякий, может кто-то уже правил и есть фикс:
Код:
FileWrite('test.txt',StringRegExpReplace($Patch & $sList[$i], '[\r\n]+', '') & @CRLF)
 

Вложения

  • image_2023-02-08_12-59-55.png
    image_2023-02-08_12-59-55.png
    30.3 КБ · Просмотры: 3

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Пример где чтобы проверить? Типа
Код:
#include <FileOperations.au3>
#include <Array.au3>
Global $i = 1

$aFileList = _FO_FileSearch("C:\AutoIt3\Aut2Exe", "*.exe", True , 125, 0)
If @error Then
    MsgBox(0, 'Сообщение', "Ошибка")
Else
    MsgBox(0, "Длина строки: " & StringLen($aFileList[$i]) & ", Путей: " & $aFileList[0], "|" & $aFileList[$i] & "|")
EndIf
 
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Пример где чтобы проверить? Типа
Код:
#include <FileOperations.au3>
#include <Array.au3>
Global $i = 1

$aFileList = _FO_FileSearch("C:\AutoIt3\Aut2Exe", "*.exe", True , 125, 0)
If @error Then
    MsgBox(0, 'Сообщение', "Ошибка")
Else
    MsgBox(0, "Длина строки: " & StringLen($aFileList[$i]) & ", Путей: " & $aFileList[0], "|" & $aFileList[$i] & "|")
EndIf
Это уже поправленный вариант:
Код:
#Include <FileOperations.au3>
$Patch = @ScriptDir & '\img\'
$PatchOut = @ScriptDir & '\Test\'
$sList = _FO_FileSearch($Patch, '*.bmp', True, 0, 0, 2)
For $i = 0 To UBound($sList)-1
    FileMove(StringRegExpReplace($Patch & $sList[$i], '[\r\n]+', ''),$PatchOut & $i+1 & '.bmp',1)
Next

С Enter будет так:
Код:
#Include <FileOperations.au3>
$Patch = @ScriptDir & '\img\'
$PatchOut = @ScriptDir & '\Test\'
$sList = _FO_FileSearch($Patch, '*.bmp', True, 0, 0, 2)
For $i = 0 To UBound($sList)-1
    FileMove($Patch & $sList[$i],$PatchOut & $i+1 & '.bmp',1)
Next

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

Забыл уточнить, файлов допустим от 100 штук будет.
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Секунду
Если в массиве правильно, то второй регвыр всё портит
 
Последнее редактирование:

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Ну я в сообщение вывожу путь и не вижу проблем. Любой лишний перенос строки покажет его и в MsgBox.
Код:
#Include <FileOperations.au3>
$Patch = @ScriptDir & '\img\'
$PatchOut = @ScriptDir & '\Test\'
$sList = _FO_FileSearch($Patch, '*.bmp', True, 0, 0, 2)
For $i = 0 To UBound($sList)-1
    ; FileMove($Patch & $sList[$i],$PatchOut & $i+1 & '.bmp',1)
    MsgBox(0, "|" & $sList[$i] & "|", "|" & $Patch & $sList[$i] & "|")
Next


Может нужен флаг 8 для FileMove, чтобы создавать папки перед тем как туда копировать. Без существующих папок не скопирует.
Массив не сохранить в блокнот, потребуется преобразование, я его не вижу. Может косяк там.
 
Последнее редактирование:
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Ну я в сообщение вывожу путь и не вижу проблем. Любой лишний перенос строки покажет его и в MsgBox.
Код:
#Include <FileOperations.au3>
$Patch = @ScriptDir & '\img\'
$PatchOut = @ScriptDir & '\Test\'
$sList = _FO_FileSearch($Patch, '*.bmp', True, 0, 0, 2)
For $i = 0 To UBound($sList)-1
    ; FileMove($Patch & $sList[$i],$PatchOut & $i+1 & '.bmp',1)
    MsgBox(0, "|" & $sList[$i] & "|", "|" & $Patch & $sList[$i] & "|")
Next



Может нужен флаг 8 для FileMove, чтобы создавать папки перед тем как туда копировать. Без существующих папок не скопирует.
Не знаю как у вас. Вот работа примера моего выше, первый файл нормально, последующие с переносом, фото прилагаю :smile:
 

Вложения

  • image_2023-02-08_13-54-57.png
    image_2023-02-08_13-54-57.png
    43.7 КБ · Просмотры: 7
  • image_2023-02-08_13-55-07.png
    image_2023-02-08_13-55-07.png
    46.5 КБ · Просмотры: 6

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Попробуйте вывод в консоль, MsgBox имеет свойство переносить длинные строки, и это может быть обманчиво.
Разгадал загадку, открыл стандартный SciTE.exe и он начал чудить в точности как вы говорите.
Попробуйте мою сборку AkelPad или сборку Notepad++ отсюда или расширенный SciTE4AutoIt3.exe с офсайта.
 
Последнее редактирование:
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
Попробуйте вывод в консоль, MsgBox имеет свойство переносить длинные строки, и это может быть обманчиво.
Разгадал загадку, открыл стандартный SciTE.exe и он начал чудить в точности как вы говорите.
Попробуйте мою сборку AkelPad
А при чем тут SciTE? Это же просто редактор, а не исполнитель. Вот фото консоли.
Сообщение автоматически объединено:

А при чем тут SciTE? Это же просто редактор, а не исполнитель. Вот фото консоли.
Да даже через блокнот делал :smile: Так же. И у меня же с офф сайта скачан SciTE, который вы и указали)
 

Вложения

  • image_2023-02-08_14-17-13.png
    image_2023-02-08_14-17-13.png
    16.1 КБ · Просмотры: 4

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
А при чем тут SciTE?
я выше ещё 2 ссылки добавил. Я не знаю причём тут SciTE, но я в нём запустил и он начал чудить в точности как вы говорите, что в консоли что в MsgBox, один в один. Просто попробуйте чтобы уйти от бесполезного диалога. Попробуйте кинуть скрипт на AutoIt3.exe, вместо того чтобы запускать его по F5 в SciTE.

Этот редактор а не исполнитель может исполнителю передать испорченные данные не понимая русские буквы например. В PureBasic например автор не заложил UTF-8 для консоли, и если сделать перевод файлов предназначенных для поддержки многоязычности, перевести на русский, то консоль не понимает кириллицу и выдаёт абракадабру, вот и пример тоже редактор..
 
Последнее редактирование:
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
я выше ещё 2 ссылки добавил. Я не знаю причём тут SciTE, но я в нём запустил и он начал чудить в точности как вы говорите, что в консоли что в MsgBox, один в один. Просто попробуйте чтобы уйти от бесполезного диалога. Попробуйте кинуть скрипт на AutoIt3.exe, вместо того чтобы запускать его по F5 в SciTE.

Этот редактор а не исполнитель может исполнителю передать испорченные данные не понимая русские буквы например. В PureBasic например автор не заложил UTF-8 для консоли, и если сделать перевод файлов предназначенных для поддержки многоязычности, перевести на русский, то консоль не понимает кириллицу и выдаёт абракадабру, вот и пример тоже редактор..
Написал код в блокноте, запустил напрямую через AutoIt3_x64.exe, все так же к сожалению.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
все так же к сожалению
я ступил, у меня запуск в 2-х версиях и я забыл что запускаю на старой версии по F5.
Пока могу только посоветовать вместо регвыр использовать
Код:
StringStripWS($sList[$i], 1)

удалить пробельные символы в начале строки.

Вдобавок консоль вместо русских букв выдавал бинарные коды вот я и подумал что с ним что-то не так.
А я видосик начал записывать и вот тут то понял что запускаю старую версию.
 
Последнее редактирование:
Автор
L

La2Angel

Новичок
Сообщения
156
Репутация
1
я ступил, у меня запуск в 2-х версиях и я забыл что запускаю на старой версии по F5.
Пока могу только посоветовать вместо регвыр использовать
Код:
StringStripWS($sList[$i], 1)

удалить пробельные символы в начале строки.

Вдобавок консоль вместо русских букв выдавал бинарные коды вот я и подумал что с ним что-то не так.
А я видосик начал записывать и вот тут то понял что запускаю старую версию.
:smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Посмотрю завтра что можно сделать, может исправлю.
Сообщение автоматически объединено:

FileOperations - на яндексе... и старую ссылку тоже обновил. Перед каждым (?m) добавил флаг (*CRLF).
А вообще ранее UTF-8 не поддерживался и при русских буквах в именах файлов автоматически создавался рег выр с поддержкой верхнего и нижнего регистра. Теперь PCRE поддерживает UTF-8 и скорее всего функция __FO_UserLocale не понадобиться, то есть флаг -1 теперь более актуален, так как он нативно будет поддерживать "не учитывать регистр".
 
Последнее редактирование:
Верх