Что нового

Проблема при переименовании папок длинными именами

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Столкнулся с проблемой при переименовании длинными именами.
Вот тестовый пример:

Код:
$sTestPath="C:\Test\"
; $sTestPath="C:\Test\Test\Test\Test\Test\Test\Test\Test\Test\"
$sPath=$sTestPath&"1"
$sNewName=$sTestPath&"Шерлок Холмс - Полная коллекция _ Sherlock Holmes - The Complete Collection (Альфред Л. Веркер _ lfred L. Werker, Рой Уильям Нилл _ oy William Neill и др.) [1939, триллер, криминал, детектив, BDemux 1080p] MVO (DVD-Classic)"
DirCreate($sPath)
DirMove($sPath,$sNewName,1)


Если берём путь C:\Test\1 - переименовывает нормально
Если взять на несколько папок в глубину C:\Test\Test\Test\Test\Test\Test\Test\Test\Test\1 , то не переименовывает.

ИМХО не правильно, что DirMove зависит от длины всего пути, а не имени, ведь другие программы (Total Commander, проводник...) нормально отрабатывают такие имена на любой глубине.

Как можно решить данную проблему?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ответ заключается в том, что MAX_PATH = 260
Это ограничение ОС Windows – 2000, XP, 2003



Добавлено:
Сообщение автоматически объединено:

На поверку у меня получилось и того меньше, 245 :(
Код:
$sName = 'i'
While (DirCreate('C:\'& $sName))
	$sName &= '\i'
WEnd
MsgBox(16, @ScriptName, 'MAX_PATH = '& StringLen($sName))



Добавлено: спустя некоторое время
Всё понял, куда делись 15 символов!
8 на имя в формате DOS + точка 1 символ (сепаратор) + расширение файла 3 символа и начало пути 3 символа 'C:\'
 
Автор
A

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Жаль, попробовал на vbs - тоже самое, при длинном пути выдаёт ошибку
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Andrey_A
Количество символов в пути не должно превышать 260, а в примере 271. При использовании длины до 32767 нужно в начале указать \\?\
\\?\C:\Test\....
но я не проверял для этого примера.
 
Автор
A

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
AZJIO [?]
При использовании длины до 32767 нужно в начале указать \\?\

AZJIO, не срабатывает, кроме того папка не переименовывается, а создаётся новая. При длинном пути ничего не происходит
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Andrey_A
изначально нерациональный подход - давать длинные имена и делать многоуровневые вложения папок. приходилось сталкиваться проблемой копирования при сохранении данных.
если писать каталогизатор файлов, то проще и практичнее иметь файл описания, в котором будет отслеживаться неодинаковость имен.
 
Автор
A

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
joiner [?]
изначально нерациональный подход - давать длинные имена и делать многоуровневые вложения папок
Причём тут подход. У меня на Autoit есть утилита TCIMG, которая автоматизирует сложные процессы/действия совместно с Total Commander, кому интересно посмотрят
http://tc-image.3dn.ru/forum/5-498-2091-16-1339461678
Утилитой пользуются сотни и у каждого задачи и реализация бывает разной...
Мне интересно почему Total Commander и проводник может переименовывать такие длинные имена, а vbs и Autoit не может?
 
Автор
A

Andrey_A

Продвинутый
Сообщения
325
Репутация
68
Garrett [?]
ни просто их режут

Только что и там и там сделал переименование, всё нормально... никаких обрезаний.

tc_ln2.png
__
tc_ln1.png
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Ну, не знаю что у вас за чудо :smile:


Добавлено:
Сообщение автоматически объединено:

Всё разобрался :smile:

Код:
#include <WinAPIEx.au3>
$sFile = '\\?\C:\Test\Test\Test\Test\Test\Test\Test\Test\Test\Шерлок Холмс - Полная коллекция _ Sherlock Holmes - The Complete Collection (Альфред Л. Веркер _ lfred L. Werker, Рой Уильям Нилл _ oy William Neill и др.) [1939, триллер, криминал, детектив, BDemux 1080p] MVO (DVD-Classic)' 
_WinAPI_CreateDirectory($sFile)
ConsoleWrite(@error)
;_WinAPI_RemoveDirectory($sFile)
;ConsoleWrite(@error)



Добавлено:
Сообщение автоматически объединено:

Только Windows отказывается с такими папками работать ;D
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Andrey_A [?]
Причём тут подход
я указал причем тут подход

joiner [?]
приходилось сталкиваться проблемой копирования при сохранении данных.
для систематизации данных более эффективно короткие имена для папок и файлов плюс файл описания. я за более-менее универсальные методы
приходилось пересохранять данные из-под LiveCD. в результате - отказ копирования файлов с длинными именами. ручная переименовка весьма утомительна.
ну..когда столкнешься, ощутишь все прелести ситуации :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett,
А у меня Ваш код (на Win7x86) завершился с ошибкой 1 и папок нет.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
у меня все получилось, но....!
появился файл типа папки, но не открывается и имеет интересное контекстное меню. смотри скрин.
создал вручную там же папку с таким же именем - система не ругнулась на конфликт имен
так что же было создано этим скриптом? :smile:
и второй скрин. как я упоминал там же создал папку с длинным названием и предложенным путем - C:\Test\Test\Test\Test\Test\Test\Test\Test\Test\Шерлок Холмс - Полная коллекция _ Sherlock Holmes - The Complete Collection (Альфред Л. Веркер _ lfred L. Werker, Рой Уильям Нилл _ oy William Neill и др.) [1939, триллер, криминал, детектив, BDemux 1080p] MVO (DVD-Classic)
при удалении появилось такое сообщение(смотри скрин 2). правда потом удалилось. при повторном запуске скрипта - ничего не было создано. система семерка х64
поэтому я и писал, что создание папок и файлов с такой длинной имени весьма нерационально. я не использую тотал командер. не привык и не нравится.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles [?]
А у меня Ваш код (на Win7x86) завершился с ошибкой 1 и папок нет.
Путь "C:\Test\Test\Test\Test\Test\Test\Test\Test\Test" должен быть создан заранее
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Разработчики не обещают добавить полноценную поддержку? Можно сесть в большую лужу: многие пользуют для бэкапа/синхронизации, можно неслабо попасть (у меня так было с TeraCopy, абсолютно случайно заметил, что размер скопированного отличается, форменное безобразие для такого рода софта).
Дублировать функции, типа DirCreate("path") и DirCreateW("path"), по аналогии с юникодными функциями WinAPI как-то нерационально. Или уже есть полноценная UDF?

joiner сказал(а):
приходилось пересохранять данные из-под LiveCD. в результате - отказ копирования файлов с длинными именами.
Есть приличный софт, которому по силам: Far, ТС (хотя, возможно, грядет баг-репорт), FastCopy.

З.Ы. Что самое грустное - программы не предупреждают, а тупо игнорят.
 
Верх