Найти - Пользователи
Полная версия: Ошибка длинного имени в Windows
Начало » Python для новичков » Ошибка длинного имени в Windows
1 2 3
Slon
Отпишись как победишь проблему.

Как вариант решения, попробовать открыть файл в hex редакторе и отрезать часть имени. (сам так не делал, чисто теория)
Alex2ndr
Slon
Отпишись как победишь проблему.

Как вариант решения, попробовать открыть файл в hex редакторе и отрезать часть имени. (сам так не делал, чисто теория)
Решил проще гораздо. Один из файликов удалил вместе с папкой - там больше ничего не было. Второй удалил так - примонтировал к линуховому серваку эту папку и удалил из линуха.

Но на этом приключения не закончились. При запуске скрипта теперь получаю такую проблему -
IDLE 2.6.1      ==== No Subprocess ====
>>>
Traceback (most recent call last):
File "F:\test-pybkpdoc.py", line 97, in <module>
print findfldt('D:\\Documents\\242\\Проекты')
File "F:\test-pybkpdoc.py", line 41, in findfldt
fltimes.append( (os.path.getmtime(fullp),fullp) )
File "C:\Python26\lib\genericpath.py", line 54, in getmtime
return os.stat(filename).st_mtime
WindowsError: [Error 2] : 'D:\\Documents\\242\\\xcf\xf0\xee\xe5\xea\xf2\xfb\\\xd1\xef\xee\xf0\xf2\\\xe3 .\xcc\xf3\xf0\xec\xe0\xed\xf1\xea\\\xcb\xe5\xe4\xee\xe2\xfb\xe9 \xe4\xe2\xee\xf0\xe5\xf6\\\xc8\xf1\xf5\xee\xe4\xed\xfb\xe5\\15-10-08\\\xcb\xe5\xe4\xee\xe2\xfb\xe9_\xef\xee\xf1\xeb\xe5\xe4\xed\xe5\xe5\\T\xf5\xf4\xfe\xf2v\xf9_\xff\xfe\xb8\xfb\xf5\xf4\xfd\xf5\xf5'
которая расшифровывается вот так -
ERROR_FILE_NOT_FOUND
2 (0x2)
The system cannot find the file specified.
У кого какие идеи?
Alex2ndr
Уфф…
Хотя я и не смог раскодировать этот код(…\\\xcf\xf0\xee\xe5\xea\xf2\xfb\\\… - вот это по русски “Проекты” - но какая это кодировка не знаю) - но файл который его вызывает я нашел(там в пути дата содержиться - вот по ней) - Там был каталог названный крякозябликами. Вероятно при распаковке какого-то архива создался. Удалил и прошел дальше (на следующий level :) ), В итоге за полчаса я по удалял много всего или в кракозябликах или например написанного спец немецким шрифтом (а с двумя точками сверху - как ё) и просто содержащего запрещенные символы (например “?” - вот как это создать то умудрились…) - но наконец настал момент, когда скрипт отработал без ошибок. Теперь посмотрим как пройдет само резервное копирование.

PS Не знал что под форточки так сложно кодить…
vcow
попробуй вторую строку заменить на
# -*- coding: utf8 -*-
Легко может быть, что после этого все заработает
Alex2ndr
vcow
попробуй вторую строку заменить на
# -*- coding: utf8 -*-
Легко может быть, что после этого все заработает
Ххе… Она у меня первоначально была utf8 (я же заголовок с линя притащил). Если ставить utf8 то внутри пути, содержащие кириллицу писать не получается (точнее получается - но дальше он их не воспринимает).
Андрей Светлов
ребята, опять те же грабли.
Ставьте
# -*- coding: utf8 -*-
или что хотите. Это влияет только на кодировки для строчек - не для файловой системы.
Windows использует для файлов кодировку mbcs
Для этого нужно вашей *юникодной* строке перед передачей в файловые функции сказать u.encode('mbcs')
Юникод получается через s.decode('utf8') если исходная строка была в нем (надеюсь, вы знаете кодировки ваших строк).
Чтобы скрипт был кроссплатформенным, вместо ‘mbcs’ нужно писать sys.getfilesystemencoding()
Для linux обычно возвращается ‘utf-8’
Предпочитаемая кодировка операционной системы - locale.getpreferredencoding()
В общем случае она не совпадает с файловой.
Кодировка для потоков ввода-вывода - sys.stdin.encoding, sys.stdout.encoding
И так далее.

В linux это незаметно - там везде utf8
Alex2ndr
Андрей Светлов
ребята, опять те же грабли.
Ставьте
# -*- coding: utf8 -*-
или что хотите. Это влияет только на кодировки для строчек - не для файловой системы.
Windows использует для файлов кодировку mbcs
Для этого нужно вашей *юникодной* строке перед передачей в файловые функции сказать u.encode('mbcs')
Юникод получается через s.decode('utf8') если исходная строка была в нем (надеюсь, вы знаете кодировки ваших строк).
Чтобы скрипт был кроссплатформенным, вместо ‘mbcs’ нужно писать sys.getfilesystemencoding()
Для linux обычно возвращается ‘utf-8’
Предпочитаемая кодировка операционной системы - locale.getpreferredencoding()
В общем случае она не совпадает с файловой.
Кодировка для потоков ввода-вывода - sys.stdin.encoding, sys.stdout.encoding
И так далее.

В linux это незаметно - там везде utf8
Спасибо, не знал про mbcs - думал везде cp1251. Под линухом все проще оказывается - пиши себе в utf8 и все сойдется.

Т е если я правильно понял то пишу в заголовке # -*- coding: utf8 -*- и таким образом все строки на кириллице внутри файла будут в utf8. Затем все имена файлов/пути я конвертирую с помощью s.decode(sys.getfilesystemencoding()) и передаю остальным модулям. Надо будет попробовать…

PS Тем временем мой скрипт работает так как я и планировал. Бэкапы делаются нормально. Только в скрипте что я дал в первом посте есть ошибка - я там сравниваю дату с размером :) - косячокс. Как доработаю выложу последнюю версию.
Андрей Светлов
Примерно так. Только будьте внимательны - .decode применять только к unicode, а .encode - к str типам. Питон не ругнется на неправильное использование - но результат будет отличаться от ожидаемого. Т.е. в
>>> Затем все имена файлов/пути я конвертирую с помощью s.decode(sys.getfilesystemencoding())
вы допустили ошибку.
Alex2ndr
Андрей Светлов
Примерно так. Только будьте внимательны - .decode применять только к unicode, а .encode - к str типам. Питон не ругнется на неправильное использование - но результат будет отличаться от ожидаемого. Т.е. в
>>> Затем все имена файлов/пути я конвертирую с помощью s.decode(sys.getfilesystemencoding())
вы допустили ошибку.
Да, ошибся. Не сразу догадался что вы переменной s обозначили тип str, а переменной u - тип unicode. Надо так -
s.encode(sys.getfilesystemencoding())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB