Что нового

[Файловая система] Переименование файла по шаблону

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
Подскажите возможно ли реализовать функцию переименования файла и как это сделать если надо переименовать один и тот же файл многократно чтоб в имя файла в конце добавлялся счетчик по порядку скажем 1.2.3.4... При том чтоб скрипт этот находил файл с определенным именем скажем faile в своем каталоге, переименовывал его скажем в faile1 и отключался, а при следующем запуске он находил тот же faile но переименовывал его faile2 и так по порядку. т.е. клонировал файл с разными именами.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
general66
так клонировал (читай копировал) или переименовал? немного разные вещи.
для начала начни с FileMove - перемещение файла в ту же папку под другим именем и есть суть переименования.
 
Автор
G

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
Kaster [?]
так клонировал (читай копировал) или переименовал? немного разные вещи.
ну по сути то подходит любой вариант клонировать\копировать\переименовать, приемлем тот вариант который максимально подойдет по единственному критерию, это более менее прогнозируемое имя файла на выходе, хотя содержание имя файла не критично. всегда можно в конце переименовать группу получившихся файлов как надо.

я использовал эту команду

Код:
FileCopy("d:\Link.au3", 'd:\'&@SEC & @ScriptName,8)


в связи с тем что содержание самого имени файла не критично, а главная задача не создать с одинаковыми именами файлы использовал макрос @SEC и все бы не чего но часто фаил создается на похожей секунде, а вариантов нет или переименовать или нет , что в автоматическом режиме не приемлемо в обоих случаях, вот собственно и задал вопрос как можно реализовать такой себе умный нумератор файлов чтоб не создавал одинаковых.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Это очень простая задача, но еще проще использовать функцию _WinAPI_PathYetAnotherMakeUniqueName() из библиотеки WinAPEx.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
general66,
Можно так попробовать:
Код:
#include <File.au3>

$sDir = @ScriptDir & '\Dir'
$sFileSearch = '*Link*.au3'; любые файлы au3, имеющие в имени Link или link
$iCount = 0
$aFile = _FileListToArray($sDir, $sFileSearch, 1)
If @error Then
	Switch @error
		Case 4
			MsgBox(64, 'Info', 'Нет файлов ' & $sFileSearch)
			Exit
		Case Else
			MsgBox(16, 'Error', 'Error')
			Exit
	EndSwitch
EndIf
For $i = 1 To $aFile[0]
	$sFileName = StringRegExpReplace($aFile[$i], '.*\\|\.[^.]*$', '')
	$sFileExt = StringRegExpReplace($aFile[$i], '^.*\.', '')
	$iNumber = StringRegExpReplace($sFileName, '[^0-9]', '')
	$sFile = StringRegExpReplace($sFileName, '[0-9_]', '')
	If Not $iNumber Then
		$sFile = $sFile & '_1.' & $sFileExt
	Else
		$sFile = $sFile & '_' & Number($iNumber) + 1 & '.' & $sFileExt
	EndIf
	If FileMove($sDir & '\' & $aFile[$i], $sDir & '\' & $sFile, 1) Then
		$iCount += 1
	EndIf
Next
MsgBox(64, 'Info', 'Найдено файлов ' & $sFileSearch & ': ' & $aFile[0] & @LF & _
		'переименовано файлов: ' & $iCount)
 
Автор
G

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
madmasles [?]
Можно так попробовать:

то что надо самое главное что скрипт нумерует по порядку мелочь но очень приятно:smile:


Yashied [?]
Это очень простая задача, но еще проще использовать функцию _WinAP
я только осваиваюсь с этим языком и в WinAPI пока не очень, хотя название функции уже многообещающие, а значит нет приделу совершенствования , значит сейчас начну разбираться что к чему, пока предыдущий скриптик делает свое "черное" дельце:smile:)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
но еще проще использовать функцию _WinAPI_PathYetAnotherMakeUniqueName()

Обнаружил, что _WinAPI_PathYetAnotherMakeUniqueName() имеет ограничение на кол-во уникальных имен - 999 (FileName (999).txt):
Код:
#include <WinAPIEx.au3>

$sFolder = @ScriptDir & '\TestFolder\Test'
$sFile = '\test.txt'

For $i = 0 To 4999
	If Not Mod($i, 999) Then ;если 1000, то файлы "теряются" (каждый тысячный)
		$sFolder = _WinAPI_PathYetAnotherMakeUniqueName($sFolder)
	EndIf
	$sPath = $sFolder & $sFile
	$hFile = FileOpen(_WinAPI_PathYetAnotherMakeUniqueName($sPath), 10)
	FileWrite($hFile, $i + 1)
	FileClose($hFile)
Next
Проверял только на Windows XP.
 
Автор
G

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
madmasles [?]
Обнаружил, что _WinAPI_PathYetAnotherMakeUniqueName() имеет ограничение
ага , хотя в моем случае если вовремя все делать то потерь может и не быть . ну и не оставлять работающий скрипт без присмотра :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
$sFolder = 'some_folder_with_all_files'
;$sFolder = @ScriptDir
$sRootFile = 'Link.au3'
$aRootFile = StringSplit($sRootFile, '.')
$sRootName = ''
For $i = 1 to $aRootFile[0] - 1
    $sRootName &= $aRootFile[$i]
Next
$sRootExt = $aRootFile[$aRootFile[0]]
If Not FileExists($sFolder & '\' & $sRootFile) Then
    MsgBox(0, '', 'Root file not found')
    Exit
EndIf
$ind = 1
$fDo = False
Do
    If Not FileExists($sFolder & '\' & $sRootName & $ind & '.' & $sRootExt) Then
        If Not FileExists($sFolder & '\' & $sRootName & $ind - 1 & '.' & $sRootExt) Then
            FileCopy($sFolder & '\' & $sRootFile, $sFolder & '\' & $sRootName & '1.' & $sRootExt)
        Else
            FileCopy($sFolder & '\' & $sRootName & $ind - 1 & '.' & $sRootExt, $sFolder & '\' & $sRootName & $ind & '.' & $sRootExt)
        EndIf
        $fDo = True
    EndIf
    $ind += 1
Until $fDo
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Я обычно вот что использую:

Код:
ConsoleWrite(_FileNewNameEx(@ScriptName, @ScriptDir))

Func _FileNewNameEx($sFileName, $sDir, $iExt_Mod = -1, $sDelim1 = -1, $sDelim2 = -1)
	If Not StringInStr(FileGetAttrib($sDir), "D") Then Return $sFileName
	If Not FileExists($sDir & "\" & $sFileName) Then Return $sFileName
	
	$sDir = StringRegExpReplace($sDir, "\\ *$", "")
	
	Local $sName = StringRegExpReplace($sFileName, "\.[^.]*$", "")
	If $iExt_Mod <> -1 Then $sName = StringRegExpReplace($sFileName, "\.[^.]*(\.[^.]*$|$)", "")
	
	If $sDelim1 = -1 Then $sDelim1 = " ("
	If $sDelim2 = -1 Then $sDelim2 = ")"
	
	Local $sDelim1_RE = StringRegExpReplace($sDelim1, '([][{}()|.?+*\\^])', '\\\1')
	Local $sDelim2_RE = StringRegExpReplace($sDelim2, '([][{}()|.?+*\\^])', '\\\1')
	
	Local $iDelim_Num = StringRegExpReplace($sName, ".*" & $sDelim1_RE & "(.*)" & $sDelim2_RE & ".*$", "\1")
	If @extended = 0 Then $iDelim_Num = 0
	
	$iDelim_Num = Number($iDelim_Num)
	
	Local $sExtn = StringRegExpReplace($sFileName, "^.*\.", ".")
	If @extended = 0 Then $sExtn = ""
	
	Local $iCount = $iDelim_Num + 1, $sRet_FileName = $sFileName
	
	While FileExists($sDir & "\" & $sRet_FileName)
		If $iDelim_Num > 0 Then
			$sRet_FileName = StringRegExpReplace($sRet_FileName, _
				"(.*)" & $sDelim1_RE & $iDelim_Num & $sDelim2_RE, "\1" & $sDelim1 & $iCount & $sDelim2)
			
			$iDelim_Num += 1
		Else
			If $sDelim1 <> -1 And $sDelim2 <> -1 Then
				$sRet_FileName = $sName & $sDelim1 & $iCount & $sDelim2 & $sExtn
			ElseIf $sDelim1 <> -1 And $sDelim2 = -1 Then
				$sRet_FileName = $sName & $sDelim1 & $iCount & $sExtn
			EndIf
		EndIf
		
		$iCount += 1
	WEnd
	
	Return $sRet_FileName
EndFunc
 
Автор
G

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
madmasles [?]
Можно так попробовать

я немного поторопился закрывать тему, сразу начал пользоваться вашем скриптом но только сейчас заметил, что он теряет файлы ситуация такая скрипт генерит постоянно файл с названием Link, а ваша часть скрипта первый раз его переименовывает в Link_1, затем создается еще один файл Link, а ваша часть скрипта пишет что файлов найдего 2, переименовано 2, а фактически в каталоге остается только 1 файл Link_2, при третьем разе остаются уже 2 файла Link_1 и Link_3, после 3го раза остаются Link_2 и Link_4, после четвертого Link_1, Link_3, Link_5 и т.д. Вот...


Kaster

ваш скрипт тоже работает с ошибкой дело в том что файл генерится с одиим именем Link и одинаковым количеством строк в нем , но разный по содержанию, а ваш скрипт создает почему то постоянно копию первого сгенеренного файла, под разными именами, хотя оригинал постоянно меняется.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
general66
Так, вроде, не теряет файлы (у меня):
Код:
#include <File.au3>

$sDir = @ScriptDir & '\Dir'
$sNewFile = 'Link.au3'
$sFileSearch = '*Link*.au3'; любые файлы au3, имеющие в имени Link или link

For $j = 1 To 10
	$iCountRename = 0
	$hFile = FileOpen($sDir & '\' & $sNewFile, 2)
	FileWrite($hFile, $j)
	FileClose($hFile)

	$aFile = _FileListToArray($sDir, $sFileSearch, 1)
	If @error Then
		Switch @error
			Case 4
				MsgBox(64, 'Info', 'Нет файлов ' & $sFileSearch)
				Exit
			Case Else
				MsgBox(16, 'Error', 'Error')
				Exit
		EndSwitch
	EndIf
	For $i = $aFile[0] To 1 Step -1
		$sFileName = StringRegExpReplace($aFile[$i], '.*\\|\.[^.]*$', '')
		$sFileExt = StringRegExpReplace($aFile[$i], '^.*\.', '')
		$iNumber = StringRegExpReplace($sFileName, '[^0-9]', '')
		$sFile = StringRegExpReplace($sFileName, '[0-9_]', '')
		If Not $iNumber Then
			$sFile = $sFile & '_1.' & $sFileExt
		Else
			$sFile = $sFile & '_' & $iNumber + 1 & '.' & $sFileExt
		EndIf
		If FileMove($sDir & '\' & $aFile[$i], $sDir & '\' & $sFile, 1) Then
			$iCountRename += 1
		EndIf
	Next
	MsgBox(64, 'Info_' & $j, 'Найдено файлов ' & $sFileSearch & ': ' & $aFile[0] & @LF & _
			'переименовано файлов: ' & $iCountRename)
Next
MsgBox(64, 'Info_All', 'Найдено файлов ' & $sFileSearch & ': ' & $aFile[0] & @LF & _
		'переименовано файлов: ' & $iCountRename)
 
Автор
G

general66

Пришел увидел наследил
Сообщения
211
Репутация
3
madmasles [?]
Так, вроде, не теряет файлы (у меня)

Оно самое :smile: переименовывает и не теряет файлы и у меня тоже спасибо еще раз за помощь . теперь можно и закрыть , вот бы еще товарищ Kaster заглянул сюда.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
general66
тогда еще проще
Код:
$sFolder = 'some_folder_with_all_files'
;$sFolder = @ScriptDir
$sRootFile = 'Link.au3'
$aRootFile = StringSplit($sRootFile, '.')
$sRootName = ''
For $i = 1 to $aRootFile[0] - 1
    $sRootName &= $aRootFile[$i]
Next
$sRootExt = $aRootFile[$aRootFile[0]]
If Not FileExists($sFolder & '\' & $sRootFile) Then
    MsgBox(0, '', 'Root file not found')
    Exit
EndIf
$ind = 1
$fDo = False
Do
    If Not FileExists($sFolder & '\' & $sRootName & $ind & '.' & $sRootExt) Then
        FileCopy($sFolder & '\' & $sRootFile, $sFolder & '\' & $sRootName & $ind & '.' & $sRootExt)
        $fDo = True
    EndIf
    $ind += 1
Until $fDo
 
Верх