Автор Тема: [Автоматизация] Поиск файлов рекурсивно по данному списку  (Прочитано 383 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 138
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Версия AutoIt: 3.5.4

Описание: есть 2 типа списков с именами файлов, выглядят вот так:
первый
Material B7E671143D244B
====================================
TEXT 2F3139D816C34D 1
TEXT B6A968EF2505A2 1
TEXT 35206697A04F91 1
TEXT EB485AF490D83D 1
TEXT 0DAB42294BD9B3 1
TEXT 3D6525BEE360E1 0

Material D6906B886B06E3
====================================
TEXT 0CCECCCCFB62AE 1
TEXT 1E14CB29AB43F0 1
TEXT FB7F0DCE9B5950 1

Material 431831490FD5C9
====================================
TEXT 9D77B6474696D8 1
TEXT D04DEE5DF130A4 1
TEXT B6A968EF2505A2 1
TEXT 8C37245A4F0F81 1
TEXT A39FAFFC5ABC06 1
TEXT D24199644F2EE6 1

второй
============================================================
ant-plastic-storage-bin-c_tmp0
============================================================
cit-storage-bins-01-color
cit-storage-bins-01-normal_dx10
cit-storage-bins-01-roughness_dx10
missingtexture_dx10

это обычные текстовые файлы.

нужно создать EXE, на который мы перетаскиваем один из этих списков (или оба, в цикл) в эксплорере и запускается процесс поиска этих файлов по имени в данной структуре каталогов, расширение может быть любым. после завершения поиска файлы нужно скопировать в папку к исходному файлу.
ищем в данной структуре по пути заданномe в INI файле, который лежит рядом с EXE

Примечания: я тут нашёл, кое-что интересное вот тут: https://www.autoitscript.com/forum/topic/186400-recursive-file-search/

Код: AutoIt [Выделить]
#include <Array.au3>
#include <File.au3>

Global $hFilePath = 'C:\Drivers'

Global $aSearch = _FileListToArrayRec ($hFilePath, "*.inf", 1, 1, 1, 1)

Global $aArray[UBound($aSearch)][3]
For $x = 1 To $aSearch[0]
    $aArray[$x][0] = $hFilePath & '\' & $aSearch[$x]
    $aArray[$x][1] = StringLeft($aSearch[$x], StringInStr($aSearch[$x], '\') - 1)
    $aArray[$x][2] = IniRead($aSearch[$x], 'Version', 'Class', 'Misc')
Next
$aArray[0][0] = UBound($aArray) - 1
_ArrayDisplay($aArray, ".inf Files")

Global $sFileText = @ScriptDir & "\Examples.csv"
Global $hFileText = FileOpen($sFileText, 2)
If $hFileText = -1 Then
    ConsoleWrite('Error opening: ' & $sFileText & @CRLF)
    Exit
EndIf

_FileWriteFromArray($hFileText, $aArray, 1, Default, ',')

FileClose($hFileText)


но моя проблема в этих непонятных [ 0 ]. я уже много чего знаю и эти массивы одна из моих бед - поэтому я прошу помощи у вас

Русское сообщество AutoIt


Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 138

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
помогите, товарищи  :-\

Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 138

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
И что в этих списках есть файлы?
в первом списке все строчки вида:
TEXT 2F3139D816C34D 1содержат имена файлов, само имя файла это "2F3139D816C34D" слово TEXT и цифру 1 нужно игнорировать, строки с Material и знаки равно нужно игнорировать:
Material B7E671143D244B
====================================

во втором списке строчки между  знаками равно "==" и сами знаки равно нужно игнорировать:
============================================================
ant-plastic-storage-bin-c_tmp0
============================================================
но зато всё остальное - это имена файлов



В какой структуре?
структура любая: хоть две папки хоть 100. там могут быть пробелы и русские символы



Где пример INI?
файл ini должен лежать рядом со скриптом и быть вида:
"D:\folder\Длинный путь\FILE_SCTRUCTURE_STARTS_FROM_HERE"

Русское сообщество AutoIt


Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 138

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Да как же вам помогать-то, если прочитав ваше техзадание возникает больше вопросов чем ответов.
приветствую, хотел узнать не нашли ли вы ещё время посмотреть?
или ещё какие-то вопросы может
« Последнее редактирование: Июнь 12, 2019, 00:46:55 от Tosyk »

Онлайн IMStrelcov [?]

  • Новичок
  • *
  • Сообщений: 41
  • Репутация: 3
  • Пол: Мужской
  • CTPEJIbLLOB
    • Награды
  • Версия AutoIt: 3.3.14.0
Давай с начала. Я понял так, что тебе нужно при перетаскивании файла на скомпилированный скрипт ***.exe, перебрать строки в перенесенном файле и выбрать все что находится между "TEXT" и "1", то есть с строки "TEXT 2F3139D816C34D 1" чтобы получилось строка "2F3139D816C34D". Правильно? Если да то что дальше с этими строками (текстом) делать?

Русское сообщество AutoIt


Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 138

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Правильно? Если да то что дальше с этими строками (текстом) делать?
да, правильно
после этого:

- принять "2F3139D816C34D" за имя файла
- найти все файлы с таким именем
- скопировать все найденные файлы в папку с исходным файлом

Онлайн IMStrelcov [?]

  • Новичок
  • *
  • Сообщений: 41
  • Репутация: 3
  • Пол: Мужской
  • CTPEJIbLLOB
    • Награды
  • Версия AutoIt: 3.3.14.0
Тогда последнее, где производить поиск, в папке со скриптом или другой определенной папке, и искать ли в подпапках?

Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 138

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Тогда последнее, где производить поиск, в папке со скриптом или другой определенной папке, и искать ли в подпапках?
нужно искать в папке написанной в ini файле, который лежит рядом со скриптом. искать нужно рекурсивно, т.е. да - и в подпапках тоже

Русское сообщество AutoIt


Онлайн IMStrelcov [?]

  • Новичок
  • *
  • Сообщений: 41
  • Репутация: 3
  • Пол: Мужской
  • CTPEJIbLLOB
    • Награды
  • Версия AutoIt: 3.3.14.0
Пробуй, я не тестил, только что накидал
Код: AutoIt [Выделить]
#cs
;файл .ini переименую так же как и имя скрипта или скомпилированого .exe
;и внеси туда эти строки
[Setting]
;поставь один или более, если файлы при копировании нужно перезаписывать
Replace=0
;укажи путь к папке в которой искать файлы
Folder=''
;поставь один или более, если нужно искать в подпапках
SubDir=0
;поставь один или более, если при копировании нужно соблюдать вложенность подпапок
Build=0
#ce


Global $sIni = StringRegExpReplace(@ScriptDir, '(^.*)\.(.*)$', '$1')& '.ini'

Global $iReplace = IniRead ($sIni, 'Setting', 'Replace', 0)
Global $sFolder = IniRead ($sIni, 'Setting', 'Folder', @ScriptDir)
Global $iSubDir = IniRead ($sIni, 'Setting', 'SubDir', 0)
Global $iBuild = IniRead ($sIni, 'Setting', 'Build', 0)

Main_()

Func Main_()
    If $CmdLine[0] Then
        Local $i_Num
        For $i_Num = 1 To $CmdLine[0]
            FileRead_($CmdLine[$i_Num])
        Next
    EndIf
EndFunc

Func FileRead_($s_File)
    Local $h_File = FileOpen($s_File)
    Local $s_String, $i_Pos
    While 1
        $s_String = FileReadLine($h_File)
        If @error Then
            FileClose($h_File)
            ExitLoop
        EndIf
        If StringInStr($s_String, 'TEXT ') Then
            $s_String = StringRegExpReplace($s_String, '(^.*)\TEXT (.*)$', '$2')
            $s_String = StringRegExpReplace($s_String, '(^.*)\ (.*)$', '$1')
            FileSearch_($sFolder, $s_String)
        EndIf
    WEnd
EndFunc

Func FileSearch_($s_Folder, ByRef $s_File)
    Local $h_Find = FileFindFirstFile($s_Folder& '\*.*')
    Local $s_Find, $s_Name
    While 1
        $s_Find = FileFindNextFile($h_Find)
        If @error Then
            FileClose($h_Find)
            ExitLoop
        EndIf
        If StringInStr(FileGetAttrib($s_Folder& '\'& $s_Find) , 'D') Then
            If $iSubDir Then
                FileSearch_($s_Folder& '\'& $s_Find, $s_File)
            EndIf
        Else
            $s_Name = StringRegExpReplace($s_Find, '(^.*)\.(.*)$', '$1')
            If $s_Name = $s_File Then
                FileCopy_($s_Folder& '\'& $s_Find)
            EndIf
        EndIf
    WEnd
EndFunc

Func FileCopy_($s_FileIn)
    Local $sFileOut
    If $iBuild Then
        $sFileOut = StringReplace($s_FileIn, $sFolder, @ScriptDir& '\Backup')
    Else
        $sFileOut = @ScriptDir& '\Backup\'& StringRegExpReplace($s_FileIn, '(^.*)\\(.*)$', '$2')
    EndIf
    FileCopy($s_FileIn, $sFileOut, $iReplace ? 9 : 8)
EndFunc

 



Добавлено: Июнь 12, 2019, 22:38:08
Нашел свою опечатку, замени
Код: AutoIt [Выделить]
Global $sIni = StringRegExpReplace(@ScriptDir, '(^.*)\.(.*)$', '$1')& '.ini'

на
Код: AutoIt [Выделить]
Global $sIni = StringRegExpReplace(@ScriptFullPath, '(^.*)\.(.*)$', '$1')& '.ini'

« Последнее редактирование: Июнь 12, 2019, 22:38:08 от IMStrelcov, Причина: Объединение сообщений »

Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 138

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
работает как надо. только при копировании структура соблюдается при любом значении параметра build
и ещё, заметил, что у меня помимо разного разрешения у некоторых файлов есть ещё дополнительно суффикс _dx10, т.е. названия файлов выглядят как "2F3139D816C34D_dx10"
вы можете этот суфикс учесть в скрипте?

Онлайн IMStrelcov [?]

  • Новичок
  • *
  • Сообщений: 41
  • Репутация: 3
  • Пол: Мужской
  • CTPEJIbLLOB
    • Награды
  • Версия AutoIt: 3.3.14.0
Исправил держи, пробуй.
(нажмите для показа/скрытия)

Оффлайн Tosyk [?]

  • Новичок
  • *
  • Сообщений: 138

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Исправил держи, пробуй
всё сработало! а можно как-то ускорить поиск(?):
может быть при нахождении одного имени файла уже не искать такой же?
возможно при запуске скрипта формировать список файлов через командную строку, искать в этом списке и копировать найденное
или как-то ещё оптимизировать?

у меня Файлов: 36 454; папок: 8 273
« Последнее редактирование: Июнь 14, 2019, 00:11:08 от Tosyk »

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
7 Ответов
7498 Просмотров
Последний ответ Апрель 16, 2011, 00:12:31
от CreatoR
3 Ответов
2827 Просмотров
Последний ответ Октябрь 31, 2010, 14:10:12
от gregaz
1 Ответов
2749 Просмотров
Последний ответ Февраль 23, 2011, 16:09:50
от `p r o x y
3 Ответов
4716 Просмотров
Последний ответ Сентябрь 03, 2011, 22:44:30
от madmasles
1 Ответов
2324 Просмотров
Последний ответ Июль 12, 2013, 14:55:29
от ---Zak---
2 Ответов
799 Просмотров
Последний ответ Август 01, 2014, 09:04:05
от olegkyka
13 Ответов
2218 Просмотров
Последний ответ Февраль 18, 2017, 13:18:29
от Parazit
15 Ответов
1720 Просмотров
Последний ответ Октябрь 09, 2017, 21:54:32
от RipVanWinkel
3 Ответов
621 Просмотров
Последний ответ Ноябрь 28, 2017, 16:49:41
от lixar21
2 Ответов
498 Просмотров
Последний ответ Октябрь 01, 2018, 13:33:31
от Snegovik