Что нового

[Файловая система] копировать файлы с переименованием

BrAWo

Новичок
Сообщения
15
Репутация
1
помогите голову сломал
есть :
папка C:\files\old\ (содержит под папки и под под папки :smile: )
папка C:\files\new\

нужно из C:\files\old\ скопировать в C:\files\new\ сохраняя внутреннею структуру папок с заменой текущих
все файлы файлы содержащие в имени @fs и расширением .xml
и заменить @fs на @fsnew

пример. файл C:\files\old\1\10\test@fs.xml должен быть скопирован C:\files\new\1\10\test@fsnew.xml
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
BrAWo

Код:
#include <Array.au3>

$aReturn = _FileDirList('C:\files\old', '*.xml', 1)
_ArrayDisplay($aReturn)

For $i = 1 To $aReturn[0]
	If StringInStr($aReturn[$i], '@fs') Then
		$Path = StringReplace($aReturn[$i], '@fs', '@fsnew')
		$Path = StringReplace($Path, '\old', '\new')
		FileCopy($aReturn[$i], $Path, 9)
	EndIf

Next

; #FUNCTION# ====================================================================================================
; Name...........:  _FileDirList
; Description....:  Search files and\or folders in a specified path (uses system Dir command)
; Syntax.........:  _FileDirList($sPath [, $sFileMask = "*" [, $iFlag = 0 [, $iSubDir = 1 [, $iSort = 0]]]])
; Parameters.....:  $sPath     - Path to search the file.
;                   $sFileMask - [Optional] Filter to use, default is "*". Search the Autoit3 helpfile for the word "WildCards" For details.
;                   $iFlag     - [Optional] Specifies whether to return files folders or both:
;                                                                                               $iFlag = 0 - Files and folders (default)
;                                                                                               $iFlag = 1 - Only files
;                                                                                               $iFlag = 2 - Only folders
;                   $iSubDir   - [Optional] Specifies whether to search in subfolders or not:
;                                                                                               $iSubDir = 1 - Search in subfolders (default). Returns full pathes.
;                                                                                               $iSubDir = 0 - Search without subfolders (only in $sPath). Returns filenames only.
;                   $iSort     - [Optional] Specifies whether to sort the output list (in alphabetic order) or not (default is 0 - do not sort).
;
; Return values..:  Success    - An array with the following elements:
;                                                                      $aArray[0] = Number of Files\Folders returned
;                                                                      $aArray[1] = 1st File\Folder
;                                                                      $aArray[2] = 2nd File\Folder
;                                                                      $aArray[3] = 3rd File\Folder
;                                                                      $aArray[n] = nth File\Folder
;                   Failure    - 0
;                      @Error:    1 = Path not found or invalid
;                                 2 = No File(s) Found
;
; Author.........:  G.Sandler (CreatoR), amel27.
; Modified.......:
; Remarks........:  This function uses system Dir command, to speed up the search.
; Related........:
; Link...........:
; Example........:
; ===============================================================================================================
Func _FileDirList($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
	Local $sOutBin, $sOut, $aOut, $aMasks, $sRead, $hDir, $sAttrib, $sFiles

	If Not StringInStr(FileGetAttrib($sPath), "D") Then
		Return SetError(1, 0, 0)
	EndIf

	If $iSubDir = 1 Then
		$sAttrib &= ' /S'
	EndIf

	If $iSort = 1 Then
		$sAttrib &= ' /O:N'
	EndIf

	Switch $iFlag
		Case 1
			$sAttrib &= ' /A-D'
		Case 2
			$sAttrib &= ' /AD'
		Case Else
			$sAttrib &= ' /A'
	EndSwitch

	$sOut = StringToBinary('0' & @CRLF, 2)
	$sPath = StringRegExpReplace($sPath, '\\+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
	$aMasks = StringSplit($sFileMask, ';')

	For $i = 1 To $aMasks[0]
		If StringStripWS($aMasks[$i], 8) = "" Then
			ContinueLoop
		EndIf

		$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'

		If $i < $aMasks[0] Then
			$sFiles &= ';'
		EndIf
	Next

	$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

	While ProcessExists($hDir)
		$sRead = StdoutRead($hDir, False, True)

		If @error Then
			ExitLoop
		EndIf

		If $sRead <> "" Then
			$sOut &= $sRead
		EndIf
	Wend

	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

	If @error Or UBound($aOut) < 2 Then
		Return SetError(2, 0, 0)
	EndIf

	$aOut[0] = UBound($aOut) - 1
	Return $aOut
EndFunc   ;==>_FileDirList
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
BrAWo
Так пойдёт? Не проверял.
Код:
; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
#include <FileOperations.au3>
$sPath = 'C:\files\old\'
$aFileList = _FO_FileSearch($sPath, '*.xml', True, 125, 0)
If @error Then Exit MsgBox(0, 'Сообщение', 'Ничего не найдено')
For $i = 1 To $aFileList[0]
	FileCopy($sPath & $aFileList[$i], 'C:\files\new\' & StringTrimRight($aFileList[$i], 4) & 'new.xml', 9)
Next
 
Автор
B

BrAWo

Новичок
Сообщения
15
Репутация
1
блиннн
во красота а я та извращался
спасибо огромное

а как
@fs на @newsv поменять
просто написал пример не совсем удачно похоже
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Тоже самое но при условии что @fs не существует в именах папки. Иначе придётся извлечь имя и сделать замену только в нём.
Код:
; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
#include <FileOperations.au3>
$sPath = 'C:\files\old\'
$aFileList = _FO_FileSearch($sPath, '*.xml', True, 125, 0)
If @error Then Exit MsgBox(0, 'Сообщение', 'Ничего не найдено')
For $i = 1 To $aFileList[0]
	FileCopy($sPath & $aFileList[$i], 'C:\files\new\' & StringReplace($aFileList[$i], '@fs', '@newsv'), 9)
Next
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
BrAWo
Идеальный вариант с заменой только в имени файла.
Код:
; http://www.autoitscript.com/forum/topic/133224-filesearch-foldersearch/
#include <FileOperations.au3>
$sPath = 'C:\files\old\'
$aFileList = _FO_FileSearch($sPath, '*.xml', True, 125, 0)
If @error Then Exit MsgBox(0, 'Сообщение', 'Ничего не найдено')
For $i = 1 To $aFileList[0]
	$aPath = _FO_PathSplit($aFileList[$i]) ; делим путь на начало пути, имя и расширения
	$aPath[1] = StringReplace($aPath[1], '@fs', '@newsv') ; замена только в имени
	FileCopy($sPath & $aFileList[$i], 'C:\files\new\' & $aPath[0] & $aPath[1] & $aPath[2], 9)
Next
 
Верх