dklab_realsync
dklab_realsync copied to clipboard
Кириллица в именах файлов
Проблема с Win8 и FreeBSD 9.
По идее, везде utf8, но при запуске удаляются все файлы с кириллицей в именах на сервере и в консоли постоянно появляется что-то вроде: file has vanished: "/cygdrive/d/....../images/673/P1030685-?????.jpg", где "????" - это кириллические символы.
Попытка добавить в RSYNC_OPTIONS что-нибуд вроде "--iconv=UTF8,UTF8" даёт ошибки: iconv_open("UTF-8", "UTF8") failed rsync error: requested action not supported (code 4) at rsync.c(120) [sender=3.0.6]
Гугление этой ошибки приводит к опции no_chroot у демона, но для не-демона такой опции нет или я чего-то не понимаю.
Вот.
Кодировки - это вообще больное место в cygwin. От версии к версии они меняют правила работы. В realsync используется далеко не самая новая версия cygwin, именно из-за того, что там проблемы с кодировками минимальны - но, видите, все же всплыло что-то.
Попробуйте запуститься на более свежей версии cygwin (заменить файлы в bin/win32) - вдруг поможет.
ok, попробую. спасибо.
Помогло, кстати? Чем дело закончилось?
На сколько я помню, нет. Закончилось объяснением человеку, что кириллица в именах файлов - это в принципе, не очень хорошо в веб-разработке. :)
На форумах нашол вот такой вариант фикса " в .bashrc: alias ls='ls --show-control-chars' " Но ето для cygwin. А как применить такие изменения в RealSync
Последний раз я экспериментировал с кодировками и cygwin применительно к RealSync 3 года назад. Вполне вероятно, что за 3-то года разработчики cygwin все посторонние эффекты починили, и достаточно просто заменить версию cygwin в составе RealSync (bin/win32) на свежую, чтобы все заработало.
Попробовал заменить и тут же столкнусля с проблемой. В новом cygwin отсутствует cygminires.dll. Поменял все "*.dll" и ".exe" файли в папке (bin/win32) видает ошибку при запуске Microsoft Windows [Version 6.1.7601]
C:\RSync>realsync.exe Can't locate File/Basename.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5 .14/x86_64-cygwin-threads /usr/lib/perl5/site_perl/5.14 /usr/lib/perl5/vendor_pe rl/5.14/x86_64-cygwin-threads /usr/lib/perl5/vendor_perl/5.14 /usr/lib/perl5/5.1 4/x86_64-cygwin-threads /usr/lib/perl5/5.14 .) at -e line 1. BEGIN failed--compilation aborted at -e line 1.
Если не менять perl.exe то запускаетса но проблема не исчезает.(Даже в консоли вместо кирилици - ASCII )
Понятно. Ну, значит, нужно экспериментировать и разбираться, простой заменой версии не обойтись. Там же накладываются 5 факторов: кодировка виндовой консоли, кодировка перла (что бы это ни означало), кодировка rsync-а, кодировка cygwin, кодировка сервера.
Попробуйте еще вот эту ошибку в перле (который из cygwin-а) решить так:
cd bin/win32
perl.exe ..\..\realsync
Потому что если вы распечатаете realsync.exe, то увидите там вот такую командную строку вызова:
bin\win32\perl.exe -e "use File::Basename; do(dirname($^X) . '/../../realsync'); die $@ if $@"
Вот в этом месте cygwin-овский perl и ругается на то, что не может найти File::Basename.
И еще может потребоваться заменить не только perl.exe на cygwin-овский, но еще и все модули, которые требуются realsync-у. Они все в bin/win32/lib/, и их очень-очень много (в том числе и их бинарные dll-ки в bin/win32/lib/auto; уж не знаю, как они в cygwin-овском perl называются и где лежат).
Попробовал поменять полностью папку bin/lib большенство файлов заменил аналогами. Не нашел аналогов за названием -Process.dll -Which.dll -bin/win32/lib/auto/Win32/ (все кроме Win32.dll) -bin/win32/lib/Win32 (почти все) -bin/win32/lib/Crypt (все) пока аналогов найти не удалось так как не знаю что именно искать. Вивод консоли при старте: C:\RSync\bin\win32>perl.exe ....\realsync Can't load 'C:/RSync/bin/win32/lib/auto/IO/IO.dll' for module IO: load_file:%1 н е є припустимим застосунком Win32 at C:/RSync/bin/win32/lib/XSLoader.pm line 71. at C:/RSync/bin/win32/lib/IO.pm line 11 Compilation failed in require at C:/RSync/bin/win32/lib/IO/Handle.pm line 266. BEGIN failed--compilation aborted at C:/RSync/bin/win32/lib/IO/Handle.pm line 266. Compilation failed in require at ....\realsync line 9. BEGIN failed--compilation aborted at ....\realsync line 9. C:\RSync\bin\win32>
Но вроде 1 раз норм кирилица прошла с Win7 на Ubuntu 12.04 (1 раз, скорее как глюк так как повторная отправка файла изменений не дала. Но факт остаетса, что уже радует.)
Тут вот какая история: для realsync-а нужны модули из Win32, чтобы сворачиваться в трей (справа внизу маленькая иконка), издавать бибиканье и т.д. Я подозреваю, что в cygwin-овском perl этих модулей нет; весь вопрос, можно ли все-таки их как-то там задействовать или нет.
...если, кстати, их никак нельзя задействовать, но perl хочется все-таки cygwin-овский, а не от ActiveState, то можно все упомянутые Win32-функции, наверное, реализовать в виде отдельного exe-шника, который в фоновом режиме должен работать и ждать команд на исполнение этих функций (например, через свой stdin). Этот exe-шник можно было бы написать на Си, скомпилировать и спокойно положить рядом в bin/win32.
Ну exe-шник врятли напишу. Мне по сути всеровно какой Perl. Сечас попробую cygwin-овский заменить на ActivreState (новой версии). Может и чтото получитса. А за ехе-шник был бы благодарен.
Вставил ехе-шник нового ActiveState. И почти успех. Кирилицу, копирует только при открытии. При запуске ярлыка RealSync все файлы с кириличискими именами нормально копируютса на remote-машыну.Но когда ети файли еще раз продублировать то опять "???.docx". Пробую заменить остальные модули Active State. Кирилица в именах сохраняєтса каждий раз при перезапуске realsync.
По максимуму заменил (все что совпало) модули с ActiveState. Попробовал запустить не пошло...Вивод вот какой.... C:\RSync\bin\win32>perl.exe ....\realsync Can't locate loadable object for module attributes in @INC (@INC contains: C:/RS ync/bin/win32/lib .) at ....\realsync line 53. Compilation failed in require at ....\realsync line 53. BEGIN failed--compilation aborted at ....\realsync line 53. C:\RSync\bin\win32> Ети файли не заменил (не нашел таких в ActiveState):
- ../lib/auto/Win32/GUI - вся папка
- ../lib/Win32/ - GUI.pm , HideConsole.pm
- ../lib/Win32/TSA/ - вся папка
- ../lib/Win32/PerlExe/ - вся папка
- ../lib/Win32/GUI/ - вся папка
- ../lib/Win32/API/ - Prototipe.pm
- ../lib/List/Util/ - PP.pm
- ../lib/Scalar/Util/ - PP.pm