Что нового

Переименование файлов по условию

eus_deus

Новичок
Сообщения
92
Репутация
0
Добрый день!
Помогите понять, а то уже голова не варит... Должно же работать...
Задача - при нахождении символов в имени файла его переименовать
Если прописываю просто:
Код:
FileMove('d:\TC\Update\aomei_partition__istant_9.5.0_te.zip', 'd:\TC\Update\aomei_partition_assistant_9.5.0_te.zip', 1)
    FileMove('d:\TC\Update\facebook_video_downloader%205.6.1.zip', 'd:\TC\Update\facebook_video_downloader_5.6.1.zip', 1)

То работает. А так, как мне бы хотелось - нет
Функция:
Код:
Func _ren_arch_chup()
    ; Объявляем переменную для работы функции
    Local $new_file
    ; В переменную $arFileList записываем как массив список архивов с папки обновлений El Chupacabra $sPathApps
    $arFileList = _FO_FileSearch($sPathApps, '*.rar|*.zip', True, 0, 1, 1, 1, '', '', '')
    ; Запускаем цикл по количеству найденных архивов (элементов массива $arFileList)
    For $i = 1 To $arFileList[0]
        $new_file = ''
        ; В переменную $aPathFile записываем как массив абсолютный путь к файлу $arFileList[$i] по частям - путь, имя файла и расширение 
        $aPathFile = _FO_PathSplit($arFileList[$i])
        ; Если в имени файла найдены символы %20, то выполняем действия
        If StringInStr($aPathFile[1], '%20') Then    
            ; В переменную $new_file записываем "новое имя файла" (удаляем лишние символы)
            $new_file = $sPathApps&'\'&StringReplace($aPathFile[1], '%20', '_')&$aPathFile[2]
            ; Переименовываем файл
            FileMove ($arFileList[$i], $new_file, 1)
        ElseIf StringInStr($aPathFile[1], '__istant') Then    
            ; В переменную $new_file записываем "новое имя файла" (удаляем лишние символы)
            $new_file = $sPathApps&'\'&StringRegExpReplace($aPathFile[1], '__istant', '_assistant')&$aPathFile[2]
;             ; Переименовываем файл
            FileMove ($arFileList[$i], $new_file, 1)
        EndIf
    Next
EndFunc
 

Oki

Новичок
Сообщения
82
Репутация
4
У меня сработало корректно.
 

xXx

╚{■_■}╗
Меценат
Сообщения
245
Репутация
94
Функция _FO_FileSearch(), как выяснилось, имеет один значительный косяк: в третью и последующие ячейки выходного массива, где прописываются пути к файлам, подмешан символ перевода строки. Соответственно функция FileMove() не может найти таких файлов и соответственно не производит никаких действий.
Код:
#include "FileOperations.au3"

Global $sPathApps = @ScriptDir
_ren_arch_chup()

Func _ren_arch_chup()
    ; Объявляем переменную для работы функции
    Local $bFlag
    ; В переменную $arFileList записываем как массив список архивов с папки обновлений El Chupacabra $sPathApps
    $arFileList = _FO_FileSearch($sPathApps, '*.rar|*.zip', True, 0, 1, 1, 1, '', '', '')
    If @error Then Return

    ; Запускаем цикл по количеству найденных архивов (элементов массива $arFileList)
    For $i = 1 To $arFileList[0]
        $bFlag = False
        ; Исправление косяков от функции _FO_FileSearch()
        $arFileList[$i] = StringStripWS($arFileList[$i], 3)
       
        ; В переменную $aPathFile записываем как массив абсолютный путь к файлу $arFileList[$i] по частям - путь, имя файла и расширение
        $aPathFile = _FO_PathSplit($arFileList[$i])

        ; Если в имени файла найдены символы %20, то ...
        If StringInStr($aPathFile[1], '%20') Then
            ; записываем "новое имя файла" (удаляем лишние символы)
            $aPathFile[1] = StringReplace($aPathFile[1], '%20', '_')
            $bFlag = True
        EndIf

        ; Если в имени файла найдено __istant, то ...
        If StringInStr($aPathFile[1], '__istant') Then
            ; записываем "новое имя файла" (удаляем лишние символы)
            $aPathFile[1] = StringReplace($aPathFile[1], '__istant', '_assistant')
            $bFlag = True
        EndIf
        ; Переименовываем файл
        If $bFlag Then FileMove($arFileList[$i], $sPathApps & '\' & $aPathFile[1] & $aPathFile[2], 1)
    Next
EndFunc   ;==>_ren_arch_chup
Сообщение автоматически объединено:

У меня сработало корректно.
Да ладно. Вы посмотрите на код и скажите, что будет если в одном имени файла встретятся символы "%20" и "__istant"?
 
Последнее редактирование:
Автор
E

eus_deus

Новичок
Сообщения
92
Репутация
0
подмешан символ перевода строки.
Ах вот как... Только попробуй его отловить, если не знаешь...
Это у себя удалил - функция работать должна только после того, как файлы попали в папку, то есть ошибок не будет
если в одном имени файла встретятся символы "%20" и "__istant"
Надеюсь, мне такое не встретится:biggrin:
А так - там, где не работало, теперь работает. Выражаю благодарность!
 

Oki

Новичок
Сообщения
82
Репутация
4
Да ладно. Вы посмотрите на код и скажите, что будет если в одном имени файла встретятся символы "%20" и "__istant"?
Это не мне надо говорить, а топикстартеру. У меня тоже сразу же руки чесались ответить, что вместо ElseIf уместно бы использовать два отдельных условия, но всё же топикстартеру виднее, какова постановка задачи, поэтому ему и решать. Вопрос состоял явно не в этом. Так что сарказм неуместен.

А тест мой сработал корректно, как теперь понятно, по той причине, что в тестовой папке с файлами только один файл соответствовал критерию переименования (и случайно оказывался первым в массиве найденных), а баг с символом перевода каретки начинает быть актуальным после первого имени файла. После добавления к тестовой папке новых файлов, отвечающих критерию, по-прежнему один файл переименовался корректно, а вот остальные файлы, действительно, не переименовываются по понятной теперь причине.

Забавно, что мой второй тест привёл к тому, что повторные перезапуски скрипта при каждой новой отработке переименовывали по одному файлу вплоть до полного успеха. Получилось так из-за того, что после переименования очередного файла, порядок получения файлов менялся в точности так, как нужно для нахождения ещё одного годного для переименования файла. Зная природу бага (так, кстати, называют ошибку в программе, которую на этом вашем воровском жаргоне именуют косяком), легко стало получить третий тест, в котором процесс заглох со старта.
 
Последнее редактирование:
Верх