Что нового

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

Автор
Tosyk

Tosyk

Чайник
Сообщения
159
Репутация
0
спасибо!
но зачем каждый раз загружать этот текстовый файл в память полностью? разве нельзя пройтись по нему поиском до совпадения с заданным именем и скопировать по номеру строчки файлы?
 

IMStrelcov

CTPEJIbLLOB
Сообщения
81
Репутация
8
Пробуй так.
Добавил параметр Update: поставь один или более, если нужно при завершении работы обновлять списки файлов/путей.
Код:
#cs
;файл .ini переименую так же как и имя скрипта или скомпилированого .exe
;и внеси туда эти строки
[Setting]
;поставь один или более, если файлы при копировании нужно перезаписывать
Replace=0
;укажи путь к папке в которой искать файлы
Folder=''
;поставь один или более, если нужно искать в подпапках
SubDir=0
;поставь один или более, если при копировании нужно соблюдать вложенность подпапок
Build=0
;поставь один или более, если нужно при завершении работы обновлять списки файлов/путей
Update=0
#ce

Global $sIniFile = StringRegExpReplace(@ScriptFullPath, '(^.*)\.(.*)$', '$1')& '.ini'
Global $sFolder = IniRead ($sIniFile, 'Setting', 'Folder', @ScriptDir)
Global $iReplace = Int(IniRead ($sIniFile, 'Setting', 'Replace', 0))
Global $iSubDir = Int(IniRead ($sIniFile, 'Setting', 'SubDir', 0))
Global $iBuild = Int(IniRead ($sIniFile, 'Setting', 'Build', 0))
Global $iUpdate = Int(IniRead ($sIniFile, 'Setting', 'Update', 0))

Global $sListFileSearch = @ScriptDir& '\ListSearch.lst'
Global $aListFileSearch = LoadListSearch_()
Global $sListFileSave = @ScriptDir& '\ListSave.lst'
Global $aListFileSave = LoadListSave_()

If $CmdLine[0] Then
	While $CmdLine[0]
		FileRead_($CmdLine[$CmdLine[0]])
		$CmdLine[0] -= 1
	WEnd
EndIf

SaveListSave_()
If $iUpdate Then
	SaveListSearch_()
EndIf

Func SaveListSearch_()
	Local $_iA, $_hFile = FileOpen($sListFileSearch, 2 +8)
	For $_iA = 1 To $aListFileSearch[0]
		FileWrite($_hFile, $aListFileSearch[$_iA]& @CRLF)
	Next
	FileClose($_hFile)
EndFunc

Func SaveListSave_()
	Local $_iA, $_hFile = FileOpen($sListFileSave, 2 +8)
	For $_iA = 1 To $aListFileSave[0]
		FileWrite($_hFile, $aListFileSave[$_iA]& @CRLF)
	Next
	FileClose($_hFile)
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

Func FileSearch_($_sName)
    Local $_iA, $_sFile
	For $_iA = 1 To $aListFileSearch[0]
		$_sFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')
		$_sFileName = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$1')
		Switch $_sFileName
			Case $_sName, $_sName& '_dx10'
				$aListFileSave[0] += 1
				ReDim $aListFileSave[$aListFileSave[0] +1]
				$aListFileSave[$aListFileSave[0]] = $_sFileName
                FileCopy_($aListFileSearch[$_iA])
				If $iUpdate Then
					$aListFileSearch[$_iA] = $aListFileSearch[0]
					ReDim $aListFileSearch[$aListFileSearch[0]]
					$aListFileSearch[0] -= 1
				EndIf
				Return 1
		EndSwitch
	Next
EndFunc

Func CheckIsSave_($_sName)
	Local $_iA
	For $_iA = 1 To $aListFileSave[0]
		If ($aListFileSave[$_iA] = $_sName) Or ($aListFileSave[$_iA] = $_sName& '_dx10') Then
			Return 1
		EndIf
	Next
	Return 0
EndFunc

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

Func LoadListSave_()
	Local $_sList
	If FileExists($sListFileSave) Then
		$_sList = FileRead($sListFileSave)
	EndIf
	Return StringSplit($_sList, @CRLF, 1)
EndFunc

Func CreateListSearch_($s_Folder)
    Local $h_Find = FileFindFirstFile($s_Folder& '\*.*')
    Local $s_Find, $_sList
    While 1
        $s_Find = FileFindNextFile($h_Find)
        If @error Then
            ExitLoop
        EndIf
        If StringInStr(FileGetAttrib($s_Folder& '\'& $s_Find) , 'D') Then
            If $iSubDir Then
                $_sList &= CreateListSearch_($s_Folder& '\'& $s_Find)
            EndIf
        Else
            $_sList &= $s_Folder& '\'& $s_Find& @CRLF
        EndIf
    WEnd
	FileClose($h_Find)
	Return $_sList
EndFunc

Func LoadListSearch_()
	Local $_sList
	If Not FileExists($sListFileSearch) Then
		$_sList = CreateListSearch_($sFolder)
		Local $_hFile = FileOpen($sListFileSearch, 2 +8)
		FileWrite($_hFile, $_sList)
		FileClose($_hFile)
	Else
		$_sList = FileRead($sListFileSearch)
	EndIf
	Return StringSplit($_sList, @CRLF, 1)
EndFunc



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

Tosyk сказал(а):
спасибо!
но зачем каждый раз загружать этот текстовый файл в память полностью? разве нельзя пройтись по нему поиском до совпадения с заданным именем и скопировать по номеру строчки файлы?
Мне кажется в таком случае ни какого прироста в скорости не будет, и при этом с этого списка не возможно удалить уже найденные файлы, а это значит что размер списка останется прежним и проходить при поиске в этом списке придется и по тем именам которые уже найдены ранее.
 
Автор
Tosyk

Tosyk

Чайник
Сообщения
159
Репутация
0
офигеть! работает шикарно! прям мгновенно начинает копировать файлы, на глазах! :beer:
единственное вот этот файл ListSave.lst он лишний, потому что у меня могут быть копии и это нормально, поэтому я их и копирую, а не переношу :-[ но я скорее всего смогу его скриптом очищать перед циклом следующего файла

и как бы адаптировать код под вот такой исходный файл:
Код:
============================================================
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
 

IMStrelcov

CTPEJIbLLOB
Сообщения
81
Репутация
8
Tosyk сказал(а):
офигеть! работает шикарно! прям мгновенно начинает копировать файлы, на глазах! :beer:
единственное вот этот файл ListSave.lst он лишний, потому что у меня могут быть копии и это нормально, поэтому я их и копирую, а не переношу :-[ но я скорее всего смогу его скриптом очищать перед циклом следующего файла
В файле ListSave.lst сохраняются имена уже скопированных файлов, чтобы их не копировать дважды.


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

Tosyk сказал(а):
и как бы адаптировать код под вот такой исходный файл:
Код:
============================================================
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
Что именно нужно сделать?
 
Автор
Tosyk

Tosyk

Чайник
Сообщения
159
Репутация
0
IMStrelcov сказал(а):
В файле ListSave.lst сохраняются имена уже скопированных файлов, чтобы их не копировать дважды.
в том то и дело, что мне нужно их копировать дважды и трижды и тд
IMStrelcov сказал(а):
Что именно нужно сделать?
нужно искать имена файлов

Код:
cit-storage-bins-01-color
cit-storage-bins-01-normal_dx10
cit-storage-bins-01-roughness_dx10
missingtexture_dx10
игнорируя то что между знаками равно и сами знаки равно
 

IMStrelcov

CTPEJIbLLOB
Сообщения
81
Репутация
8
Tosyk сказал(а):
в том то и дело, что мне нужно их копировать дважды и трижды
А смысл, если при многократном копировании файлов с одинаковыми именами, они просто в папке с исходным скриптом будут перезаписываться?


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

Tosyk сказал(а):
игнорируя то что между знаками равно и сами знаки равно
Здесь можно сделать только если есть всегда закономерность в твоих файлах:
т.е. идет многократное равно
текст, который нужно пропустить
и опять многократное равно.
Если есть эта закономерность то реализовать пропуск этих кусков текста можно без труда.
 
Автор
Tosyk

Tosyk

Чайник
Сообщения
159
Репутация
0
IMStrelcov сказал(а):
А смысл, если при многократном копировании файлов с одинаковыми именами, они просто в папке с исходным скриптом будут перезаписываться?
так я ещё в первом сообщении писал: "после завершения поиска файлы нужно скопировать в папку к исходному файлу"
всё равно меняю функцию на:
Код:
Func FileCopy_($s_FileIn)
    Local $sFileOut
    If $iBuild Then
        $sFileOut = StringReplace($s_FileIn, $sFolder, @WorkingDir& '\textures')
    Else
        $sFileOut = @WorkingDir& '\textures\' & StringRegExpReplace($s_FileIn, '(^.*)\\(.*)$', '$2')
    EndIf
    FileCopy($s_FileIn, $sFileOut, $iReplace ? 9 : 8)
EndFunc

IMStrelcov сказал(а):
Здесь можно сделать только если есть всегда закономерность в твоих файлах:
т.е. идет многократное равно
текст, который нужно пропустить
и опять многократное равно.
Если есть эта закономерность то реализовать пропуск этих кусков текста можно без труда.
такая закономерность есть! :D
 

IMStrelcov

CTPEJIbLLOB
Сообщения
81
Репутация
8
Tosyk сказал(а):
нужно искать имена файлов

Код:
cit-storage-bins-01-color
cit-storage-bins-01-normal_dx10
cit-storage-bins-01-roughness_dx10
missingtexture_dx10
игнорируя то что между знаками равно и сами знаки равно
Адаптировал.
Код:
#cs
;файл .ini переименую так же как и имя скрипта или скомпилированого .exe
;и внеси туда эти строки
[Setting]
;поставь один или более, если файлы при копировании нужно перезаписывать
Replace=0
;укажи путь к папке в которой искать файлы
Folder=''
;поставь один или более, если нужно искать в подпапках
SubDir=0
;поставь один или более, если при копировании нужно соблюдать вложенность подпапок
Build=0
;поставь один или более, если нужно при завершении работы обновлять списки файлов/путей
Update=0
#ce

Global $sIniFile = StringRegExpReplace(@ScriptFullPath, '(^.*)\.(.*)$', '$1')& '.ini'
Global $sFolder = IniRead ($sIniFile, 'Setting', 'Folder', @ScriptDir)
Global $iReplace = Int(IniRead ($sIniFile, 'Setting', 'Replace', 0))
Global $iSubDir = Int(IniRead ($sIniFile, 'Setting', 'SubDir', 0))
Global $iBuild = Int(IniRead ($sIniFile, 'Setting', 'Build', 0))
Global $iUpdate = Int(IniRead ($sIniFile, 'Setting', 'Update', 0))

Global $sListFileSearch = @ScriptDir& '\ListSearch.lst'
Global $aListFileSearch = LoadListSearch_()
Global $sListFileSave = @ScriptDir& '\ListSave.lst'
Global $aListFileSave = LoadListSave_()

If $CmdLine[0] Then
	While $CmdLine[0]
		FileRead_($CmdLine[$CmdLine[0]])
		$CmdLine[0] -= 1
	WEnd
EndIf

SaveListSave_()
If $iUpdate Then
	SaveListSearch_()
EndIf

Func SaveListSearch_()
	Local $_iA, $_hFile = FileOpen($sListFileSearch, 2 +8)
	For $_iA = 1 To $aListFileSearch[0]
		FileWrite($_hFile, $aListFileSearch[$_iA]& @CRLF)
	Next
	FileClose($_hFile)
EndFunc

Func SaveListSave_()
	Local $_iA, $_hFile = FileOpen($sListFileSave, 2 +8)
	For $_iA = 1 To $aListFileSave[0]
		FileWrite($_hFile, $aListFileSave[$_iA]& @CRLF)
	Next
	FileClose($_hFile)
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

Func FileSearch_($_sName)
    Local $_iA, $_sFile
	For $_iA = 1 To $aListFileSearch[0]
		$_sFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')
		$_sFileName = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$1')
		Switch $_sFileName
			Case $_sName, $_sName& '_dx10'
				$aListFileSave[0] += 1
				ReDim $aListFileSave[$aListFileSave[0] +1]
				$aListFileSave[$aListFileSave[0]] = $_sFileName
                FileCopy_($aListFileSearch[$_iA])
				If $iUpdate Then
					$aListFileSearch[$_iA] = $aListFileSearch[0]
					ReDim $aListFileSearch[$aListFileSearch[0]]
					$aListFileSearch[0] -= 1
				EndIf
				Return 1
		EndSwitch
	Next
EndFunc

Func CheckIsSave_($_sName)
	Local $_iA
	For $_iA = 1 To $aListFileSave[0]
		If ($aListFileSave[$_iA] = $_sName) Or ($aListFileSave[$_iA] = $_sName& '_dx10') Then
			Return 1
		EndIf
	Next
	Return 0
EndFunc

Func FileRead_($s_File)
    Local $h_File = FileOpen($s_File)
    Local $_sName, $i_Pos, $_sOldName, $_iStopper
    While 1
        $_sName = FileReadLine($h_File)
        If @error Then
            FileClose($h_File)
            ExitLoop
        EndIf
		If StringLeft($_sName, 9) = 'Material ' Then
			$_iStopper = True
			ContinueLoop
		ElseIf StringLeft($_sName, 1) = '=' Then
			$_iStopper = ($_iStopper = False)
			ContinueLoop
		ElseIf $_iStopper Then
			ContinueLoop
		EndIf
		If StringInStr($_sName, 'TEXT ') Then
			$_sName = StringRegExpReplace($_sName, '(^.*)\TEXT (.*)$', '$2')
			$_sName = StringRegExpReplace($_sName, '(^.*)\ (.*)$', '$1')
		EndIf
		If Not CheckIsSave_($_sName) Then
			FileSearch_($_sName)
		EndIf
    WEnd
EndFunc

Func LoadListSave_()
	Local $_sList
	If FileExists($sListFileSave) Then
		$_sList = FileRead($sListFileSave)
	EndIf
	Return StringSplit($_sList, @CRLF, 1)
EndFunc

Func CreateListSearch_($s_Folder)
    Local $h_Find = FileFindFirstFile($s_Folder& '\*.*')
    Local $s_Find, $_sList
    While 1
        $s_Find = FileFindNextFile($h_Find)
        If @error Then
            ExitLoop
        EndIf
        If StringInStr(FileGetAttrib($s_Folder& '\'& $s_Find) , 'D') Then
            If $iSubDir Then
                $_sList &= CreateListSearch_($s_Folder& '\'& $s_Find)
            EndIf
        Else
            $_sList &= $s_Folder& '\'& $s_Find& @CRLF
        EndIf
    WEnd
	FileClose($h_Find)
	Return $_sList
EndFunc

Func LoadListSearch_()
	Local $_sList
	If Not FileExists($sListFileSearch) Then
		$_sList = CreateListSearch_($sFolder)
		Local $_hFile = FileOpen($sListFileSearch, 2 +8)
		FileWrite($_hFile, $_sList)
		FileClose($_hFile)
	Else
		$_sList = FileRead($sListFileSearch)
	EndIf
	Return StringSplit($_sList, @CRLF, 1)
EndFunc
 
Автор
Tosyk

Tosyk

Чайник
Сообщения
159
Репутация
0
работает отлично! спасибо огромное за время и терпение :D
Сообщение автоматически объединено:

Адаптировал.
Код:
#cs
;файл .ini переименую так же как и имя скрипта или скомпилированого .exe
;и внеси туда эти строки
[Setting]
;поставь один или более, если файлы при копировании нужно перезаписывать
Replace=0
;укажи путь к папке в которой искать файлы
Folder=''
;поставь один или более, если нужно искать в подпапках
SubDir=0
;поставь один или более, если при копировании нужно соблюдать вложенность подпапок
Build=0
;поставь один или более, если нужно при завершении работы обновлять списки файлов/путей
Update=0
#ce

Global $sIniFile = StringRegExpReplace(@ScriptFullPath, '(^.*)\.(.*)$', '$1')& '.ini'
Global $sFolder = IniRead ($sIniFile, 'Setting', 'Folder', @ScriptDir)
Global $iReplace = Int(IniRead ($sIniFile, 'Setting', 'Replace', 0))
Global $iSubDir = Int(IniRead ($sIniFile, 'Setting', 'SubDir', 0))
Global $iBuild = Int(IniRead ($sIniFile, 'Setting', 'Build', 0))
Global $iUpdate = Int(IniRead ($sIniFile, 'Setting', 'Update', 0))

Global $sListFileSearch = @ScriptDir& '\ListSearch.lst'
Global $aListFileSearch = LoadListSearch_()
Global $sListFileSave = @ScriptDir& '\ListSave.lst'
Global $aListFileSave = LoadListSave_()

If $CmdLine[0] Then
    While $CmdLine[0]
        FileRead_($CmdLine[$CmdLine[0]])
        $CmdLine[0] -= 1
    WEnd
EndIf

SaveListSave_()
If $iUpdate Then
    SaveListSearch_()
EndIf

Func SaveListSearch_()
    Local $_iA, $_hFile = FileOpen($sListFileSearch, 2 +8)
    For $_iA = 1 To $aListFileSearch[0]
        FileWrite($_hFile, $aListFileSearch[$_iA]& @CRLF)
    Next
    FileClose($_hFile)
EndFunc

Func SaveListSave_()
    Local $_iA, $_hFile = FileOpen($sListFileSave, 2 +8)
    For $_iA = 1 To $aListFileSave[0]
        FileWrite($_hFile, $aListFileSave[$_iA]& @CRLF)
    Next
    FileClose($_hFile)
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

Func FileSearch_($_sName)
    Local $_iA, $_sFile
    For $_iA = 1 To $aListFileSearch[0]
        $_sFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')
        $_sFileName = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$1')
        Switch $_sFileName
            Case $_sName, $_sName& '_dx10'
                $aListFileSave[0] += 1
                ReDim $aListFileSave[$aListFileSave[0] +1]
                $aListFileSave[$aListFileSave[0]] = $_sFileName
                FileCopy_($aListFileSearch[$_iA])
                If $iUpdate Then
                    $aListFileSearch[$_iA] = $aListFileSearch[0]
                    ReDim $aListFileSearch[$aListFileSearch[0]]
                    $aListFileSearch[0] -= 1
                EndIf
                Return 1
        EndSwitch
    Next
EndFunc

Func CheckIsSave_($_sName)
    Local $_iA
    For $_iA = 1 To $aListFileSave[0]
        If ($aListFileSave[$_iA] = $_sName) Or ($aListFileSave[$_iA] = $_sName& '_dx10') Then
            Return 1
        EndIf
    Next
    Return 0
EndFunc

Func FileRead_($s_File)
    Local $h_File = FileOpen($s_File)
    Local $_sName, $i_Pos, $_sOldName, $_iStopper
    While 1
        $_sName = FileReadLine($h_File)
        If @error Then
            FileClose($h_File)
            ExitLoop
        EndIf
        If StringLeft($_sName, 9) = 'Material ' Then
            $_iStopper = True
            ContinueLoop
        ElseIf StringLeft($_sName, 1) = '=' Then
            $_iStopper = ($_iStopper = False)
            ContinueLoop
        ElseIf $_iStopper Then
            ContinueLoop
        EndIf
        If StringInStr($_sName, 'TEXT ') Then
            $_sName = StringRegExpReplace($_sName, '(^.*)\TEXT (.*)$', '$2')
            $_sName = StringRegExpReplace($_sName, '(^.*)\ (.*)$', '$1')
        EndIf
        If Not CheckIsSave_($_sName) Then
            FileSearch_($_sName)
        EndIf
    WEnd
EndFunc

Func LoadListSave_()
    Local $_sList
    If FileExists($sListFileSave) Then
        $_sList = FileRead($sListFileSave)
    EndIf
    Return StringSplit($_sList, @CRLF, 1)
EndFunc

Func CreateListSearch_($s_Folder)
    Local $h_Find = FileFindFirstFile($s_Folder& '\*.*')
    Local $s_Find, $_sList
    While 1
        $s_Find = FileFindNextFile($h_Find)
        If @error Then
            ExitLoop
        EndIf
        If StringInStr(FileGetAttrib($s_Folder& '\'& $s_Find) , 'D') Then
            If $iSubDir Then
                $_sList &= CreateListSearch_($s_Folder& '\'& $s_Find)
            EndIf
        Else
            $_sList &= $s_Folder& '\'& $s_Find& @CRLF
        EndIf
    WEnd
    FileClose($h_Find)
    Return $_sList
EndFunc

Func LoadListSearch_()
    Local $_sList
    If Not FileExists($sListFileSearch) Then
        $_sList = CreateListSearch_($sFolder)
        Local $_hFile = FileOpen($sListFileSearch, 2 +8)
        FileWrite($_hFile, $_sList)
        FileClose($_hFile)
    Else
        $_sList = FileRead($sListFileSearch)
    EndIf
    Return StringSplit($_sList, @CRLF, 1)
EndFunc
подскажите пожалуйста как копировать файлы и с суфиксом _dx10 и без него?
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
81
Репутация
8
подскажите пожалуйста как копировать файлы и с суфиксом _dx10 и без него?
Код:
#cs
;файл .ini переименую так же как и имя скрипта или скомпилированого .exe
;и внеси туда эти строки
[Setting]
;поставь один или более, если файлы при копировании нужно перезаписывать
Replace=0
;укажи путь к папке в которой искать файлы
Folder=''
;поставь один или более, если нужно искать в подпапках
SubDir=0
;поставь один или более, если при копировании нужно соблюдать вложенность подпапок
Build=0
;поставь один или более, если нужно при завершении работы обновлять списки файлов/путей
Update=0
#ce

Global $sIniFile = StringRegExpReplace(@ScriptFullPath, '(^.*)\.(.*)$', '$1')& '.ini'
Global $sFolder = IniRead ($sIniFile, 'Setting', 'Folder', @ScriptDir)
Global $iReplace = Int(IniRead ($sIniFile, 'Setting', 'Replace', 0))
Global $iSubDir = Int(IniRead ($sIniFile, 'Setting', 'SubDir', 0))
Global $iBuild = Int(IniRead ($sIniFile, 'Setting', 'Build', 0))
Global $iUpdate = Int(IniRead ($sIniFile, 'Setting', 'Update', 0))

Global $sListFileSearch = @ScriptDir& '\ListSearch.lst'
Global $aListFileSearch = LoadListSearch_()
Global $sListFileSave = @ScriptDir& '\ListSave.lst'
Global $aListFileSave = LoadListSave_()

If $CmdLine[0] Then
    While $CmdLine[0]
        FileRead_($CmdLine[$CmdLine[0]])
        $CmdLine[0] -= 1
    WEnd
EndIf

SaveListSave_()
If $iUpdate Then
    SaveListSearch_()
EndIf

Func SaveListSearch_()
    Local $_iA, $_hFile = FileOpen($sListFileSearch, 2 +8)
    For $_iA = 1 To $aListFileSearch[0]
        FileWrite($_hFile, $aListFileSearch[$_iA]& @CRLF)
    Next
    FileClose($_hFile)
EndFunc

Func SaveListSave_()
    Local $_iA, $_hFile = FileOpen($sListFileSave, 2 +8)
    For $_iA = 1 To $aListFileSave[0]
        FileWrite($_hFile, $aListFileSave[$_iA]& @CRLF)
    Next
    FileClose($_hFile)
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

Func FileSearch_($_sName)
    Local $_iA, $_sFile
    For $_iA = 1 To $aListFileSearch[0]
        $_sFileDir = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$1')
        $_sFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')
        $_sFileType = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$2')
        $_sFileName = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$1')
        Switch $_sFileName
            Case $_sName, $_sName& '_dx10'
                $aListFileSave[0] += 1
                ReDim $aListFileSave[$aListFileSave[0] +1]
                $aListFileSave[$aListFileSave[0]] = $_sFileName
                FileCopy_($_sFileDir&'\'&$_sFileName&'.'&$_sFileType)
                If $_sFileName = $_sName Then
                    FileCopy_($_sFileDir&'\'&$_sFileName&'._dx10'&$_sFileType)
                Else
                    $_sFileName = StringTrimRight($_sFileName, 5)
                    FileCopy_($_sFileDir&'\'&$_sFileName&'.'&$_sFileType)
                EndIf
                If $iUpdate Then
                    $aListFileSearch[$_iA] = $aListFileSearch[0]
                    ReDim $aListFileSearch[$aListFileSearch[0]]
                    $aListFileSearch[0] -= 1
                EndIf
                Return 1
        EndSwitch
    Next
EndFunc

Func CheckIsSave_($_sName)
    Local $_iA
    For $_iA = 1 To $aListFileSave[0]
        If ($aListFileSave[$_iA] = $_sName) Or ($aListFileSave[$_iA] = $_sName& '_dx10') Then
            Return 1
        EndIf
    Next
    Return 0
EndFunc

Func FileRead_($s_File)
    Local $h_File = FileOpen($s_File)
    Local $_sName, $i_Pos, $_sOldName, $_iStopper
    While 1
        $_sName = FileReadLine($h_File)
        If @error Then
            FileClose($h_File)
            ExitLoop
        EndIf
        If StringLeft($_sName, 9) = 'Material ' Then
            $_iStopper = True
            ContinueLoop
        ElseIf StringLeft($_sName, 1) = '=' Then
            $_iStopper = ($_iStopper = False)
            ContinueLoop
        ElseIf $_iStopper Then
            ContinueLoop
        EndIf
        If StringInStr($_sName, 'TEXT ') Then
            $_sName = StringRegExpReplace($_sName, '(^.*)\TEXT (.*)$', '$2')
            $_sName = StringRegExpReplace($_sName, '(^.*)\ (.*)$', '$1')
        EndIf
        If Not CheckIsSave_($_sName) Then
            FileSearch_($_sName)
        EndIf
    WEnd
EndFunc

Func LoadListSave_()
    Local $_sList
    If FileExists($sListFileSave) Then
        $_sList = FileRead($sListFileSave)
    EndIf
    Return StringSplit($_sList, @CRLF, 1)
EndFunc

Func CreateListSearch_($s_Folder)
    Local $h_Find = FileFindFirstFile($s_Folder& '\*.*')
    Local $s_Find, $_sList
    While 1
        $s_Find = FileFindNextFile($h_Find)
        If @error Then
            ExitLoop
        EndIf
        If StringInStr(FileGetAttrib($s_Folder& '\'& $s_Find) , 'D') Then
            If $iSubDir Then
                $_sList &= CreateListSearch_($s_Folder& '\'& $s_Find)
            EndIf
        Else
            $_sList &= $s_Folder& '\'& $s_Find& @CRLF
        EndIf
    WEnd
    FileClose($h_Find)
    Return $_sList
EndFunc

Func LoadListSearch_()
    Local $_sList
    If Not FileExists($sListFileSearch) Then
        $_sList = CreateListSearch_($sFolder)
        Local $_hFile = FileOpen($sListFileSearch, 2 +8)
        FileWrite($_hFile, $_sList)
        FileClose($_hFile)
    Else
        $_sList = FileRead($sListFileSearch)
    EndIf
    Return StringSplit($_sList, @CRLF, 1)
EndFunc
 
Автор
Tosyk

Tosyk

Чайник
Сообщения
159
Репутация
0
спасибо большое! но почему то не копирует оба файла, по прежнему копирует только те у которых есть суффикс _dx10
 

IMStrelcov

CTPEJIbLLOB
Сообщения
81
Репутация
8
Пробуй так.
Код:
#cs
;файл .ini переименую так же как и имя скрипта или скомпилированого .exe
;и внеси туда эти строки
[Setting]
;поставь один или более, если файлы при копировании нужно перезаписывать
Replace=0
;укажи путь к папке в которой искать файлы
Folder=''
;поставь один или более, если нужно искать в подпапках
SubDir=0
;поставь один или более, если при копировании нужно соблюдать вложенность подпапок
Build=0
;поставь один или более, если нужно при завершении работы обновлять списки файлов/путей
Update=0
#ce

Global $sIniFile = StringRegExpReplace(@ScriptFullPath, '(^.*)\.(.*)$', '$1')& '.ini'
Global $sFolder = IniRead ($sIniFile, 'Setting', 'Folder', @ScriptDir)
Global $iReplace = Int(IniRead ($sIniFile, 'Setting', 'Replace', 0))
Global $iSubDir = Int(IniRead ($sIniFile, 'Setting', 'SubDir', 0))
Global $iBuild = Int(IniRead ($sIniFile, 'Setting', 'Build', 0))
Global $iUpdate = Int(IniRead ($sIniFile, 'Setting', 'Update', 0))

Global $sListFileSearch = @ScriptDir& '\ListSearch.lst'
Global $aListFileSearch = LoadListSearch_()
Global $sListFileSave = @ScriptDir& '\ListSave.lst'
Global $aListFileSave = LoadListSave_()

If $CmdLine[0] Then
    While $CmdLine[0]
        FileRead_($CmdLine[$CmdLine[0]])
        $CmdLine[0] -= 1
    WEnd
EndIf

SaveListSave_()
If $iUpdate Then
    SaveListSearch_()
EndIf

Func SaveListSearch_()
    Local $_iA, $_hFile = FileOpen($sListFileSearch, 2 +8)
    For $_iA = 1 To $aListFileSearch[0]
        FileWrite($_hFile, $aListFileSearch[$_iA]& @CRLF)
    Next
    FileClose($_hFile)
EndFunc

Func SaveListSave_()
    Local $_iA, $_hFile = FileOpen($sListFileSave, 2 +8)
    For $_iA = 1 To $aListFileSave[0]
        FileWrite($_hFile, $aListFileSave[$_iA]& @CRLF)
    Next
    FileClose($_hFile)
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

Func FileSearch_($_sName)
    Local $_iA, $_sFile
    For $_iA = 1 To $aListFileSearch[0]
        $_sFileDir = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$1')
        $_sFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')
        $_sFileType = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$2')
        $_sFileName = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$1')
        Switch $_sFileName
            Case $_sName
                $aListFileSave[0] += 1
                ReDim $aListFileSave[$aListFileSave[0] +1]
                $aListFileSave[$aListFileSave[0]] = $_sFileName
                FileCopy_($aListFileSearch[$_iA])
                If StringRight($_sFileName, 5) = '_dx10' Then
                    $_sFileName = StringTrimRight($_sFileName, 5)
                    FileCopy_($_sFileDir&'\'&$_sFileName&'.'&$_sFileType)
                Else
                    $_sFileName &= '_dx10'
                    FileCopy_($_sFileDir&'\'&$_sFileName&'.'&$_sFileType)
                EndIf
                If $iUpdate Then
                    $aListFileSearch[$_iA] = $aListFileSearch[0]
                    ReDim $aListFileSearch[$aListFileSearch[0]]
                    $aListFileSearch[0] -= 1
                EndIf
                Return 1
        EndSwitch
    Next
EndFunc

Func CheckIsSave_($_sName)
    Local $_iA
    For $_iA = 1 To $aListFileSave[0]
        If $aListFileSave[$_iA] = $_sName Then
            Return 1
        EndIf
    Next
    Return 0
EndFunc

Func FileRead_($s_File)
    Local $h_File = FileOpen($s_File)
    Local $_sName, $i_Pos, $_sOldName, $_iStopper
    While 1
        $_sName = FileReadLine($h_File)
        If @error Then
            FileClose($h_File)
            ExitLoop
        EndIf
        If StringLeft($_sName, 9) = 'Material ' Then
            $_iStopper = True
            ContinueLoop
        ElseIf StringLeft($_sName, 1) = '=' Then
            $_iStopper = ($_iStopper = False)
            ContinueLoop
        ElseIf $_iStopper Then
            ContinueLoop
        EndIf
        If StringInStr($_sName, 'TEXT ') Then
            $_sName = StringRegExpReplace($_sName, '(^.*)\TEXT (.*)$', '$2')
            $_sName = StringRegExpReplace($_sName, '(^.*)\ (.*)$', '$1')
        EndIf
        If Not CheckIsSave_($_sName) Then
            FileSearch_($_sName)
        EndIf
    WEnd
EndFunc

Func LoadListSave_()
    Local $_sList
    If FileExists($sListFileSave) Then
        $_sList = FileRead($sListFileSave)
    EndIf
    Return StringSplit($_sList, @CRLF, 1)
EndFunc

Func CreateListSearch_($s_Folder)
    Local $h_Find = FileFindFirstFile($s_Folder& '\*.*')
    Local $s_Find, $_sList
    While 1
        $s_Find = FileFindNextFile($h_Find)
        If @error Then
            ExitLoop
        EndIf
        If StringInStr(FileGetAttrib($s_Folder& '\'& $s_Find) , 'D') Then
            If $iSubDir Then
                $_sList &= CreateListSearch_($s_Folder& '\'& $s_Find)
            EndIf
        Else
            $_sList &= $s_Folder& '\'& $s_Find& @CRLF
        EndIf
    WEnd
    FileClose($h_Find)
    Return $_sList
EndFunc

Func LoadListSearch_()
    Local $_sList
    If Not FileExists($sListFileSearch) Then
        $_sList = CreateListSearch_($sFolder)
        Local $_hFile = FileOpen($sListFileSearch, 2 +8)
        FileWrite($_hFile, $_sList)
        FileClose($_hFile)
    Else
        $_sList = FileRead($sListFileSearch)
    EndIf
    Return StringSplit($_sList, @CRLF, 1)
EndFunc
 
Автор
Tosyk

Tosyk

Чайник
Сообщения
159
Репутация
0
да, так копирует! спасибо большое за помощь!
Сообщение автоматически объединено:

а можете объяснить как FileSearch_ функция работает? я хочу файлы сравнивать по размеру и копировать в разные папки, но пока что даже consoleWrite ничего полезного не говорит
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
81
Репутация
8
а можете объяснить как FileSearch_ функция работает?
Код:
Func FileSearch_($_sName)
    Local $_iA, $_sFile
    ;при первом старте скрипта создается список файлов и хранится в файле ListSearch.lst,
    ;при последующих запусках скрипта этот список подгружается в переменную $aListFileSearch
    ;перебираем массив $aListFileSearch, список файлов, и ...
    For $_iA = 1 To $aListFileSearch[0]
        ;получаем путь к файлу
        $_sFileDir = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$1')
        ;получаем имя и тип файла
        $_sFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')
        ;получаем только тип файла
        $_sFileType = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$2')
        ;получаем только имя файла
        $_sFileName = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$1')
        ;если имя файла из списка $aListFileSearch совпадает с именем $_sName искомого, то ...
        Switch $_sFileName
            Case $_sName
                ;добавляем этот файл в список уже найденных
                $aListFileSave[0] += 1
                ReDim $aListFileSave[$aListFileSave[0] +1]
                $aListFileSave[$aListFileSave[0]] = $_sFileName
                ;и копируем его
                FileCopy_($aListFileSearch[$_iA])
                ;после проверяем в имени префикс _dx10, если есть, то ...
                If StringRight($_sFileName, 5) = '_dx10' Then
                    ;копируем файл без префикса _dx10
                    $_sFileName = StringTrimRight($_sFileName, 5)
                    FileCopy_($_sFileDir&'\'&$_sFileName&'.'&$_sFileType)
                Else
                    ;если нет копируем файл с префиксом _dx10
                    $_sFileName &= '_dx10'
                    FileCopy_($_sFileDir&'\'&$_sFileName&'.'&$_sFileType)
                EndIf
                ;если в параметрах стоит обновлять списки, то
                ;удаляем имя этого файла из списка $aListFileSearch
                If $iUpdate Then
                    $aListFileSearch[$_iA] = $aListFileSearch[0]
                    ReDim $aListFileSearch[$aListFileSearch[0]]
                    $aListFileSearch[0] -= 1
                EndIf
                Return 1
        EndSwitch
    Next
EndFunc
 
Автор
Tosyk

Tosyk

Чайник
Сообщения
159
Репутация
0
спасибо, очень полезно!
Сообщение автоматически объединено:

я модифицировал скрипт чтобы сравнивать размеры файлов и всё заработало! :smile:

Код:
Func FileSearch_($_sName)
    Local $_iA, $_sFile
    ;при первом старте скрипта создается список файлов и хранится в файле ListSearch.lst,
    ;при последующих запусках скрипта этот список подгружается в переменную $aListFileSearch
    ;перебираем массив $aListFileSearch, список файлов, и ...
    For $_iA = 1 To $aListFileSearch[0]
        ;получаем путь к файлу
        $_sFileDir = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$1')
        ;получаем имя и тип файла
        $_sFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')
        ;получаем только тип файла
        $_sFileType = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$2')
        ;получаем только имя файла
        $_sFileName = StringRegExpReplace($_sFileName, '(^.*)\.(.*)$', '$1')
        ;если имя файла из списка $aListFileSearch совпадает с именем $_sName искомого, то ...
        Switch $_sFileName
            Case $_sName
                ;добавляем этот файл в список уже найденных
                $aListFileSave[0] += 1
                ReDim $aListFileSave[$aListFileSave[0] +1]
                $aListFileSave[$aListFileSave[0]] = $_sFileName
                ;и копируем его
                FileCopy_($aListFileSearch[$_iA])

                Local $FirstFileName = StringRegExpReplace($aListFileSearch[$_iA], '(^.*)\\(.*)$', '$2')

                ;после проверяем в имени префикс _dx10, если есть, то ...
                If StringRight($_sFileName, 5) = '_dx10' Then
                    ;копируем файл без префикса _dx10
                    $_sFileName = StringTrimRight($_sFileName, 5)
                    FileCopy_($_sFileDir&'\'&$_sFileName&'.'&$_sFileType)
                Else
                    ;если нет копируем файл с префиксом _dx10
                    $_sFileName &= '_dx10'
                    FileCopy_($_sFileDir&'\'&$_sFileName&'.'&$_sFileType)
                EndIf

                Local $SecondFileName = $_sFileName & '.' & $_sFileType

                Local $sLSuf = '\_low\'
                Local $sFileDirPathTmp0 = @ScriptDir & '\Backup'

                If (FileGetSize ($sFileDirPathTmp0 & '\' & $FirstFileName)) <> 0 AND (FileGetSize ($sFileDirPathTmp0 & '\' & $FirstFileName)) < (FileGetSize ($sFileDirPathTmp0 & '\' & $SecondFileName)) Then
                   FileMove($sFileDirPathTmp0 & '\' & $FirstFileName, $sFileDirPathTmp0 & $sLSuf & $FirstFileName, $FC_OVERWRITE)
                ElseIf (FileGetSize ($sFileDirPathTmp0 & '\' & $FirstFileName)) <> 0 AND (FileGetSize ($sFileDirPathTmp0 & '\' & $FirstFileName)) > (FileGetSize ($sFileDirPathTmp0 & '\' & $SecondFileName)) Then
                   FileMove($sFileDirPathTmp0 & '\' & $SecondFileName, $sFileDirPathTmp0 & $sLSuf & $SecondFileName, $FC_OVERWRITE)
                EndIf

                ;если в параметрах стоит обновлять списки, то
                ;удаляем имя этого файла из списка $aListFileSearch
                If $iUpdate Then
                    $aListFileSearch[$_iA] = $aListFileSearch[0]
                    ReDim $aListFileSearch[$aListFileSearch[0]]
                    $aListFileSearch[0] -= 1
                EndIf
                Return 1
        EndSwitch
    Next
EndFunc
 
Последнее редактирование:
Верх