Старожил
Сообщения: 352
Благодарности: 192
|
Профиль
|
Отправить PM
| Цитировать
Вариант для переименования одного файла, прикрутить пакетную обработку, думаю, несложно будет
Скрытый текст
Код:
Local Const $APP_NAME = "fb2renamer"
Local Const $APP_VERSION = "0.1"
Local Const $APP_TITLE = $APP_NAME & " v" & $APP_VERSION
Local $g_oXML
Main()
Func _ReadXMLNodeText($oXMLobj, $sNode)
Local $result = $oXMLobj.SelectSingleNode($sNode)
If IsObj($result) Then
Return $result.text
Else
Return ""
EndIf
EndFunc ;==>_ReadXMLNodeText
Func _ReadXMLNodeAttrib($oXMLobj, $sNode, $sAttrib)
Local $sXPath = $sNode & "[@" & $sAttrib & "]"
Local $result = $oXMLobj.SelectSingleNode($sXPath)
If IsObj($result) Then
Return $result.getAttribute($sAttrib)
Else
Return ""
EndIf
EndFunc ;==>_ReadXMLNodeAttrib
Func _GetParentDir($sFileName)
Return StringLeft($sFileName, StringInStr($sFileName, "\", 0, -1) - 1)
EndFunc ;==>_GetParentDir
Func _GetFileName($sFileName)
Return StringTrimLeft($sFileName, StringInStr($sFileName, "\", 0, -1))
EndFunc ;==>_GetFileName
Func _GetNewName($sFile)
If $g_oXML.load($sFile) Then
Local $result
Local $sLastName, $sMiddleName, $sFirstName, $sBookTitle, $sSequenseName, $sSequenseNumber, $sDate
Local $oNode = $g_oXML.SelectSingleNode("//FictionBook/description/title-info")
$sLastName = _ReadXMLNodeText($oNode, "author/last-name")
$sMiddleName = _ReadXMLNodeText($oNode, "author/middde-name")
$sFirstName = _ReadXMLNodeText($oNode, "author/first-name")
$sBookTitle = _ReadXMLNodeText($oNode, "book-title")
$sSequenseName = _ReadXMLNodeAttrib($oNode, "sequence", "name")
$sSequenseNumber = _ReadXMLNodeAttrib($oNode, "sequence", "number")
$sDate = _ReadXMLNodeAttrib($oNode, "date", "value")
If $sDate == "" Then
$oNode = $g_oXML.SelectSingleNode("//FictionBook/description/document-info")
$sDate = _ReadXMLNodeAttrib($oNode, "date", "value")
EndIf
; Новое имя файла:
Local $sNewFileName = "" _
& $sLastName & " " _
& $sFirstName & " " _
& $sMiddleName & " - " _
& $sSequenseName & " " _
& ($sSequenseNumber <> "" ? "(" & $sSequenseNumber & ")" : "") & " " _
& $sDate & " - " _
& $sBookTitle _
& ".fb2"
$sNewFileName = StringRegExpReplace($sNewFileName, "\ +", " ")
$sNewFileName = StringReplace($sNewFileName, " - - ", " - ")
Return $sNewFileName
Else
SetError(1) ; 1 == file not found
Return ""
EndIf
EndFunc ;==>_GetNewName
Func _DisplayHelp()
MsgBox(0, $APP_TITLE, "" _
& @ScriptName & " [ -y ] FILE1 FILE2 ... FILE(n)" & @CRLF _
& @CRLF _
& @TAB & "-y" & @TAB & "Переименовать файлы вместо тестирования" & @CRLF _
)
Exit 0
EndFunc ;==>_DisplayHelp
Func _PickUpNewName($sFileName)
Local $sNewName = $sFileName
Local $iCount = 1
While True
If FileExists($sNewName) Then
$sNewName = StringRegExpReplace($sNewName, " \([0-9]+\).fb2", " \(" & $iCount & "\).fb2")
If @extended = 0 Then $sNewName = StringReplace($sNewName, ".fb2", " (" & $iCount & ").fb2")
Else
ExitLoop
EndIf
$iCount += 1
WEnd
Return $sNewName
EndFunc ;==>_PickUpNewName
Func _RenameSingleFile($bTestMode, $sFileName)
Local $sOldFullName = FileGetLongName($sFileName, 1)
Local $sOldFileName = _GetFileName($sOldFullName)
Local $sFolderName = _GetParentDir($sOldFullName)
Local $sNewFileName = _GetNewName($sOldFullName)
Local $sNewFullName = _PickUpNewName($sFolderName & "\" & $sNewFileName)
$sNewFileName = _GetFileName($sNewFullName)
If $bTestMode Then
Local $iBtn = MsgBox(4, $APP_TITLE, "" _
& "Папка: " & @CRLF _
& $sFolderName & @CRLF & @CRLF _
& "Имя книги:" & @CRLF _
& $sOldFileName & @CRLF & @CRLF _
& "Новое имя: " & @CRLF _
& $sNewFileName & @CRLF & @CRLF _
& @CRLF _
& "Переименовать?" _
)
If $iBtn = 6 Then FileMove($sOldFullName, $sNewFullName)
Else
FileMove($sOldFullName, $sNewFullName)
EndIf
EndFunc ;==>_RenameSingleFile
Func _QuitWithMessage($sMessage, $iMsgBoxCode = 0, $iExitCode = 0)
MsgBox($iMsgBoxCode, $APP_TITLE, $sMessage)
Exit $iExitCode
EndFunc ;==>_QuitWithMessage
Func Main()
$g_oXML = ObjCreate("Microsoft.XMLDOM")
If Not IsObj($g_oXML) Then _QuitWithMessage("Ошибка инициализации XML :(", 16, 1)
Local $bOptTestMode = True
If $CmdLine[0] = 0 Then _DisplayHelp()
For $i = 1 To $CmdLine[0]
Select
Case $CmdLine[$i] = "/?"
_DisplayHelp()
Case $CmdLine[$i] = "-y"
$bOptTestMode = False
Case FileExists($CmdLine[$i])
_RenameSingleFile($bOptTestMode, $CmdLine[$i])
EndSelect
Next
EndFunc ;==>Main
|