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

  • Май 20, 2012, 13:21:22 *
  • Добро пожаловать, Гость
Пожалуйста, войдите или зарегистрируйтесь.

Войти
Расширенный поиск  

Новости:

Вы новичок? Хотите начать изучение AutoIt и не знаете с чего начать?

Для начала ознакомьтесь с темой Быстрый старт для работы с AutoIt.
Затем осмотрите раздел Инструменты и помощь по AutoIt.

Реклама

Автор Тема: [Файловая система] Переименование файла по шаблону  (Прочитано 1390 раз)

0 Пользователей и 2 Гостей смотрят эту тему.

general66 [?]

  • Новичок
  • *
  • Репутация: 1
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 116
  • Версия AutoIt: 3.3.6.1
  • Пришел увидел наследил
    • Награды
Подскажите возможно ли реализовать функцию переименования файла и как это сделать если надо переименовать один и тот же файл многократно чтоб в имя файла в конце добавлялся счетчик по порядку скажем 1.2.3.4...  При том чтоб скрипт этот находил файл с определенным именем скажем faile в своем каталоге, переименовывал его скажем в faile1 и отключался, а при следующем запуске он находил тот же faile но переименовывал его faile2 и так по порядку. т.е. клонировал файл с разными именами.




  Записан

Kaster [?]

  • Глобальный модератор
  • *
  • *****
  • Репутация: 502
  • Online Online
  • Пол: Мужской
  • Сообщений: 3286
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
general66
так клонировал (читай копировал) или переименовал? немного разные вещи.
для начала начни с FileMove - перемещение файла в ту же папку под другим именем и есть суть переименования.




  Записан
Конференция посвященная AutoIt на jabber.ru - autoit@conference.jabber.ru
Как попасть на конференцию читаем тут
Файлы можете качать сюда - Файловая область
Продолжать дискуссию в теме отмеченной как "Решенная" - моветон.
Банхамером не обладаю, так что расслабьтесь ;)
Банхамером обладаю, так что не расслабляться :Ban:

general66 [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 1
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 116
  • Версия AutoIt: 3.3.6.1
  • Пришел увидел наследил
    • Награды
Kaster  [?]
Цитата
так клонировал (читай копировал) или переименовал? немного разные вещи.
ну по сути то подходит любой вариант клонировать\копировать\переименовать, приемлем тот вариант который максимально подойдет по единственному критерию, это более менее прогнозируемое имя файла на выходе, хотя содержание имя файла не критично. всегда можно в конце переименовать группу получившихся файлов как надо.

я использовал эту команду
 
Код: AutoIt [Выделить]
FileCopy("d:\Link.au3", 'd:\'&@SEC & @ScriptName,8)

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




  Записан

Yashied [?]

  • Глобальный модератор
  • AutoIt MVP
  • *
  • *****
  • Репутация: 1905
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 3968
  • Версия AutoIt: 3+
    • Награды
Это очень простая задача, но еще проще использовать функцию _WinAPI_PathYetAnotherMakeUniqueName() из библиотеки WinAPIEx.au3.




  Записан
Думай, прежде чем говорить.

madmasles [?]

  • Модератор
  • *
  • *****
  • Репутация: 1425
  • Online Online
  • Пол: Мужской
  • Сообщений: 3814
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
general66,
Можно так попробовать:
Код: AutoIt [Выделить]
#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)
« Последнее редактирование: Апрель 26, 2011, 13:49:09 от madmasles »



  Записан

general66 [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 1
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 116
  • Версия AutoIt: 3.3.6.1
  • Пришел увидел наследил
    • Награды
madmasles  [?]
Цитата
Можно так попробовать:

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


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




  Записан

madmasles [?]

  • Модератор
  • *
  • *****
  • Репутация: 1425
  • Online Online
  • Пол: Мужской
  • Сообщений: 3814
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
Yashied  [?]
Цитата
но еще проще использовать функцию _WinAPI_PathYetAnotherMakeUniqueName()

Обнаружил, что _WinAPI_PathYetAnotherMakeUniqueName() имеет ограничение на кол-во уникальных имен - 999 (FileName (999).txt):
Код: AutoIt [Выделить]
#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.




  Записан

general66 [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 1
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 116
  • Версия AutoIt: 3.3.6.1
  • Пришел увидел наследил
    • Награды
madmasles  [?]
Цитата
Обнаружил, что _WinAPI_PathYetAnotherMakeUniqueName() имеет ограничение
ага , хотя в моем случае если вовремя все делать то потерь может и не быть . ну и не оставлять работающий скрипт без присмотра :)




  Записан

Kaster [?]

  • Глобальный модератор
  • *
  • *****
  • Репутация: 502
  • Online Online
  • Пол: Мужской
  • Сообщений: 3286
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
Код: AutoIt [Выделить]
$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 [?]

  • Администратор
  • *
  • *****
  • Репутация: 1399
  • Online Online
  • Пол: Мужской
  • Сообщений: 5058
  • Версия AutoIt: 3.2.8.1+
  • AutoIt is simple, subtle, elegant
    • WWW
    • Награды
Я обычно вот что использую:

Код: AutoIt [Выделить]
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




  Записан
Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.



«Не оказываю техподдержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

general66 [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 1
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 116
  • Версия AutoIt: 3.3.6.1
  • Пришел увидел наследил
    • Награды
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 [?]

  • Модератор
  • *
  • *****
  • Репутация: 1425
  • Online Online
  • Пол: Мужской
  • Сообщений: 3814
  • Версия AutoIt: 3.3.6.1 - 3.3.9.4
    • Награды
general66
Так, вроде, не теряет файлы (у меня):
Код: AutoIt [Выделить]
#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)




  Записан

general66 [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 1
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 116
  • Версия AutoIt: 3.3.6.1
  • Пришел увидел наследил
    • Награды
madmasles  [?]
Цитата
Так, вроде, не теряет файлы (у меня)

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




  Записан

Kaster [?]

  • Глобальный модератор
  • *
  • *****
  • Репутация: 502
  • Online Online
  • Пол: Мужской
  • Сообщений: 3286
  • Версия AutoIt: 3.3.8.1
  • Мой Аватар, он лучший самый
    • Награды
general66
тогда еще проще
Код: AutoIt [Выделить]
$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
 




  Записан

general66 [?]

  • Новичок
  • *

  • Автор темы
  • Репутация: 1
  • Offline Offline
  • Пол: Мужской
  • Сообщений: 116
  • Версия AutoIt: 3.3.6.1
  • Пришел увидел наследил
    • Награды
Kaster  [?]
Цитата
тогда еще проще

Вот и чудненько и ваш вариант тоже работает на ура теперь. Спасибо огромное за помощ.




  Записан
 


Похожие темы
Тема Автор Ответов Просмотров Последний ответ
[Файловая система] Корректный запуск файла
AutoIt для новичков
gregaz 4 1389 Последний ответ Февраль 05, 2010, 18:44:52
от gregaz
[Файловая система] Восстановление удаленного файла
AutoIt для новичков
gregaz 53 4777 Последний ответ Февраль 22, 2012, 09:17:22
от StarEdik
[Файловая система] Взять инфу из файла
AutoIt для новичков
modnik 5 1201 Последний ответ Март 06, 2010, 13:23:01
от gregaz
[Файловая система] Проверка на наличие строки, перемещение файла содержащего её
Стол заказов
SVD 14 1627 Последний ответ Май 16, 2011, 17:48:55
от Garrett
[Файловая система] Как записать байты в середину файла с помощью FileSetPos?
AutoIt для новичков
ohos 3 431 Последний ответ Сентябрь 05, 2011, 22:52:57
от Kaster
[Файловая система] Запуск файла с расширением .mac
AutoIt для новичков
alexnasnet 12 726 Последний ответ Ноябрь 07, 2011, 22:25:39
от Zaramot
[Файловая система] Копирование файла при запуске
Стол заказов
trudovik 7 637 Последний ответ Январь 10, 2012, 16:50:34
от Medic84
[Файловая система] Пробел в начале названия файла
Стол заказов
Rjevsky 17 1005 Последний ответ Январь 28, 2012, 22:49:50
от madmasles
[Файловая система] получение имени файла для создания папки
AutoIt для новичков
Tosyk 2 255 Последний ответ Февраль 10, 2012, 18:13:00
от madmasles
Переименование группы файлов по определенному шаблону
AutoIt для новичков
Dimmak 2 183 Последний ответ Март 08, 2012, 21:01:36
от Dimmak


Реклама

* Последние сообщения на форуме
post Re: Проблема с циклами While
[AutoIt для новичков] Andeangl Сегодня в 13:15:19
post Re: Уроки программирования и автоматизации посредством AutoIt для чайников
[Инструменты и помощь по AutoIt] ynbIpb Сегодня в 13:15:02
post Re: [Мышь, клавиатура] Привязка клика по координатам к клавише
[Стол заказов] megatoxx Сегодня в 12:41:37
post Re: Проблема с циклами While
[AutoIt для новичков] Yashied Сегодня в 12:14:25
post Сглаживание рывков при передачи новых координат игрока по TCP/IP
[Общение] Ganibal95 Сегодня в 12:10:37
post Перенесено: Уроки программирования и автоматизации посредством AutoIt для чайников
[AutoIt для новичков] Yashied Сегодня в 12:09:28
post Re: Защита исходного кода программы
[AutoIt для новичков] iamOmg Сегодня в 12:09:05
post Проблема с циклами While
[AutoIt для новичков] Andeangl Сегодня в 11:03:15
post Уроки программирования и автоматизации посредством AutoIt для чайников
[Инструменты и помощь по AutoIt] aak Сегодня в 09:41:45
post Re: Как спарсить ссылку внутри тега "td" определенного класса
[Регулярные выражения и прочее] eropov Сегодня в 05:27:00

* Пользователи онлайн
  • Dot Гостей: 108
  • Dot Скрыт: 2
  • Dot Пользователей: 31
  • Dot Пользователи Online: