#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 сказал(а):спасибо!
но зачем каждый раз загружать этот текстовый файл в память полностью? разве нельзя пройтись по нему поиском до совпадения с заданным именем и скопировать по номеру строчки файлы?
============================================================
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
В файле ListSave.lst сохраняются имена уже скопированных файлов, чтобы их не копировать дважды.Tosyk сказал(а):офигеть! работает шикарно! прям мгновенно начинает копировать файлы, на глазах! :beer:
единственное вот этот файл 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
в том то и дело, что мне нужно их копировать дважды и трижды и тдIMStrelcov сказал(а):В файле ListSave.lst сохраняются имена уже скопированных файлов, чтобы их не копировать дважды.
нужно искать имена файловIMStrelcov сказал(а):Что именно нужно сделать?
cit-storage-bins-01-color
cit-storage-bins-01-normal_dx10
cit-storage-bins-01-roughness_dx10
missingtexture_dx10
А смысл, если при многократном копировании файлов с одинаковыми именами, они просто в папке с исходным скриптом будут перезаписываться?Tosyk сказал(а):в том то и дело, что мне нужно их копировать дважды и трижды
Здесь можно сделать только если есть всегда закономерность в твоих файлах:Tosyk сказал(а):игнорируя то что между знаками равно и сами знаки равно
так я ещё в первом сообщении писал: "после завершения поиска файлы нужно скопировать в папку к исходному файлу"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
такая закономерность есть! :DIMStrelcov сказал(а):Здесь можно сделать только если есть всегда закономерность в твоих файлах:
т.е. идет многократное равно
текст, который нужно пропустить
и опять многократное равно.
Если есть эта закономерность то реализовать пропуск этих кусков текста можно без труда.
Адаптировал.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
подскажите пожалуйста как копировать файлы и с суфиксом _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
подскажите пожалуйста как копировать файлы и с суфиксом _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
#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
а можете объяснить как 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
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
подскажите пожалуйста как адаптировать код вот под такой список:Пробуй так.
Добавил параметр 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
Добавлено:Сообщение автоматически объединено:
Мне кажется в таком случае ни какого прироста в скорости не будет, и при этом с этого списка не возможно удалить уже найденные файлы, а это значит что размер списка останется прежним и проходить при поиске в этом списке придется и по тем именам которые уже найдены ранее.
sm_0
---------------
0: dummy_gray
1: c_com_socksa_mt
2: c_com_socksa_tn
3: dummy_white
4: default_z
5: dummy_nmap
6: ---
7: ---
sm_1
---------------
0: c_com_prisoner_shoes_di
1: c_com_prisoner_shoes_mt
2: c_com_prisoner_shoes_tn
3: dummy_white
4: default_z
5: c_com_leatherb_rt
6: ---
7: ---
sm_2
---------------
0: c_am_ookubo_pants_di
1: c_am_ookubo_pants_mt
2: c_am_ookubo_pants_tn
3: c_am_ookubo_pants_rd
4: c_com_suita_rm
5: c_com_suita_rt
6: ---
7: ---