Что нового

[Файловая система] Сменить кодировку имени файла

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
С помощью Dr.Web Live CD перенес файлы с упавшей Windows на рабочий комп. Все русские буквы в названиях файлах превратились в фарш :wacko: - даже в SciTE эти названия вставляются не так, как отображены в проводнике. Перелопатил Encoding UTF - безрезультатно. Помог Штирлиц (программа для перекодировки файлов и текстов) - сразу перекодировал как надо - кодировка UTF-8, но переименовывать гору файлов и папок по одному это не выход. Помогите с решением проблемы!
Вот название пары файлов из проводника и их перевод:
Код:
Инструкция по установке.htm
НОВЫЕ графики 08-09днев.xls
Код:
Инструкция по установке.htm
НОВЫЕ графики 08-09днев.xls
И пробный скрипт:
Код:
#include <encoding.au3>
$search = FileFindFirstFile("*.htm")

If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
EndIf

While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
	$a = _Encoding_UTF8ToANSI(FileGetLongName($file))
	MsgBox(0, '', $a)
    MsgBox(4096, "File:", $file)
WEnd

; Close the search handle
FileClose($search)


Нашел обходное решение - включаем в Штирлице слежение за буфером обмена - и через него гоняем имена файлов массивами :laugh:
Код:
#include <array.au3>

$search = FileFindFirstFile("*.*")

Dim $arr[10], $arr2[10]

If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
EndIf
$nomer = 0
While 1
    $file = FileFindNextFile($search)
    If @error Then ExitLoop
	$arr[$nomer] = FileGetLongName($file)
        $nomer += 1
WEnd
ClipPut(_ArrayToString($arr))
Sleep(2000)
$arr2 = StringSplit(ClipGet(), '|', 2)

For $i = 0 To UBound($arr) - 1
	FileMove($arr[$i], $arr2[$i])
Next

FileClose($search)


Но решение на чистом AutoIT все еще ищется.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
А чем пробный скрипт то не устраивает? А то у меня encoding.au3 нет.

А вообще я бы как то так делал:
Код:
$search = FileFindFirstFile('*')
If $search = -1 Then
    MsgBox(0, "Error", "No files/directories matched the search pattern")
    Exit
EndIf
While 1
    $file1 = FileFindNextFile($search)
    If @error Then ExitLoop
	If $file1 = @ScriptName Then ContinueLoop
    $file2 = StringFromASCIIArray(StringToASCIIArray($file1, 0, Default, 0), 0, Default, 2)
	If MsgBox(36, 'Renamer', 'Rename?' & @CRLF & $file1 & @CRLF & $file2) = 6 Then
		FileMove($file1, $file2)
	EndIf
WEnd
 
Автор
Redline

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
dwerf [?]
А вообще я бы как то так делал:
Супер! :laugh:
Вот encoding UDF, если интересно. http://autoit-script.ru/index.php?topic=510.msg3460#msg3460

Скрипт переписал - чтобы мог менять имена папок, а также ходил по всем папкам и подпапкам, находящимся на одном уровне вложения со скриптом.
Код:
#include <File.au3>
#include <Array.au3>

Global $aDir[1], $file1 = '', $file2 = '', $left = '', $right = ''

_ArrayAddFileListSubDir($aDir, @ScriptDir)

For $i = UBound($aDir) - 1 To 1 Step -1 ; обход из конца массива в начало - начиная с более глубоких папок, чтобы не ломать структуры массива
	$file1 = $aDir[$i]
	If $file1 = @ScriptFullPath Then ContinueLoop ; пропустить если обрабатываемый файл является скриптом
	$left = StringRegExpReplace($file1, '\\[^\\]*$', '') ; путь без имени файла или последней папки
	$right = StringFromASCIIArray(StringToASCIIArray(StringRegExpReplace($file1, '^.*\\', ''), 0, Default, 0), 0, Default, 2) ; имя файла или последней папки
	$file2 = $left & '\' & $right
	If $file1 = $file2 Then ContinueLoop ; если смена кодировки не принесла изменений - пропускаем
    If MsgBox(36, 'Renamer', 'Rename?' & @CRLF & @CRLF & $file1 & @CRLF & $file2) = 6 Then ; диалог переименования
		If StringInStr(FileGetAttrib($file1), 'D') Then ; если файл - это папка
			DirMove($file1, $file2)
		Else ; просто файл
			FileMove($file1, $file2)
		EndIf
    EndIf
Next
; построение файл-листа для папки - автор Amel27
Func _ArrayAddFileListSubDir(ByRef $aGDir, $sPath)
    Local $i = UBound($aGDir), $aLDir = _FileListToArray($sPath, '*')
    _ArrayAddFileList($aGDir, $sPath)
    While $i < UBound($aGDir)
        _ArrayAddFileList($aGDir, $aGDir[$i])
        $i += 1
    WEnd
EndFunc

Func _ArrayAddFileList(ByRef $aGDir, $sPath)
    Local $i, $aLDir = _FileListToArray($sPath, '*')
    If UBound($aGDir, 0) = 1 And UBound($aLDir, 0) = 1 Then
        For $i = 1 To $aLDir[0]
            _ArrayAdd($aGDir, $sPath & '\' & $aLDir[$i])
        Next
    EndIf
EndFunc
 
Верх