Вверх ↑
Этот топик читают: Гость
Ответов: 49
Рейтинг: 11
#1: 2020-03-03 16:54:09 ЛС | профиль | цитата
Дано:
Использую последние версии пакета компонентов FTP_Client, проверил.
Структура и система именования на локальном (в корпоративной сети) ftp-сервере изменить нет возможности.

Трабл:
Столкнулся с проблемой, обсуждаемой в сети немало.
Если на ftp-сервере есть папка и/или файл с пробелом, напр. "Для тестов.mp4", в листинге выдаются, но ни перейти в соотв. директорию, ни воспользоваться файлом.
Экранирование "\", "/",подмена на "%20" не помогают, перекодировка - тоже. Заключение всего пути в кавычки эффекта не даёт. Я сдался и воспользовался виндовым клиентом и temp скриптом.
Но хочется воспользоваться штатными средствами, а не танцевать с внешними скриптами. Иначе они в пакете на что?

Вот мой полигон:
Add(MainForm,2953706,98,140)
{
Left=0
Top=0
Width=540
Height=372
Align=0
Color=-16777201
Font=[Segoe UI,10,0,0,204]
ParentFont=1
Visible=0
Enabled=0
Cursor=0
KeyPreview=0
TabOrder=0
Ctl3D=1
WinStyle=0
Name=""
Hint=""
HintManager="(empty)"
Layout="(empty)"
WidthScale=0
HeightScale=0
AlphaBlendValue=255
Caption="Try to goto ftp dir with whitespaces"
BorderStyle=2
WindowsState=0
Icon=[]
TaskBar=0
DragForm=1
TransparentColor=16777215
Picture=[]
SavePosName=""
MouseCapture=1
ClientSize=1
Position=0
ShiftLeft=0
ShiftTop=0
TransparentManager="(empty)"
FormFastening="(empty)"
Point(onClose)
link(onCreate,2760025:doTimer,[])
link(onClose,12459923:doClose,[(145,167)(145,202)])
}
Add(FTP_Client,12459923,217,189)
{
@Color=65535
Name="ftp_synol"
Host="synology.local"
Username="manager"
Password="[psw]"
Port=21
ErrorEvent=0
link(onConnect,16190135:doOn,[(269,195)(269,174)])
link(onDisconnect,16190135:doOff,[(274,202)(274,167)])
link(onGlobalError,14317570:doEvent1,[])
}
Add(FTPC_DirAction,11506876,875,196)
{
@Color=65535
Action=0
Directory=""
ErrorEvent=0
FTP_Client="ftp_synol"
link(Directory,10422315:Value,[(881,182)(816,182)(816,240)(783,240)])
}
Add(DoData,5924905,602,196)
{
Data=Null()
link(onEventData,6190417:doEvent1,[])
link(Data,16048045:Text,[])
}
Add(Memory,10422315,777,196)
{
Default=Null()
link(onData,6980240:doEvent1,[])
}
Add(FTPC_DirAction,2161259,875,315)
{
@Color=65535
Action=1
Directory=""
ErrorEvent=0
FTP_Client="ftp_synol"
Point(CurrentDir)
link(onDirAction,9887956:doEvent1,[])
}
Add(Timer,2760025,154,154)
{
Interval=500
Enable=1
AutoStop=1
OverCall=0
link(onTimer,12459923:doOpen,[(202,160)(202,195)])
}
Add(Edit,16048045,602,147)
{
Left=125
Top=5
Width=385
Height=20
Align=0
Color=-16777211
Font=[MS Sans Serif,8,0,0,1]
ParentFont=0
Visible=0
Enabled=0
Cursor=0
KeyPreview=0
TabOrder=0
Ctl3D=0
WinStyle=0
Name=""
Hint=""
HintManager="(empty)"
Layout="(empty)"
WidthScale=0
HeightScale=0
ModeSp=0
SizeSp=4
ColorSp=-16777201
MinOwn=0
MinRest=0
Text="/Proxy/TVPROGRAMPROXY/ТЕСТ/Для тестов_0"
Alignment=0
DataType=0
Password=1
ReadOnly=1
MaxLenField=0
ClearAfterEnter=1
AddHint(-77,-64,201,39,Text)
}
Add(LED,15742840,371,196)
{
@Hint=#12:Global Error|
Left=25
Top=5
Width=30
Height=30
Align=0
Color=-16777201
Font=[MS Sans Serif,8,0,0,1]
ParentFont=1
Visible=0
Enabled=0
Cursor=0
KeyPreview=0
TabOrder=0
Ctl3D=0
WinStyle=2
Name=""
Hint=""
HintManager="(empty)"
Layout="(empty)"
WidthScale=0
HeightScale=0
Shape=1
Blick=1
ColorOn=255
ColorOff=-16777201
ColorBlick=16777215
Value=1
AddHint(-27,-21,70,13,@Hint)
}
Add(Timer,4849110,315,210)
{
Interval=250
Enable=1
AutoStop=6
OverCall=0
Point(onStop)
link(onTimer,15742840:doChangeValue,[(359,216)(359,202)])
}
Add(BitBtn,14332600,546,196)
{
Left=65
Top=5
Width=55
Height=20
Align=0
Color=-16777201
Font=[MS Sans Serif,8,0,0,1]
ParentFont=0
Visible=0
Enabled=0
Cursor=0
KeyPreview=0
TabOrder=0
Ctl3D=1
WinStyle=0
Name=""
Hint=""
HintManager="(empty)"
Layout="(empty)"
WidthScale=0
HeightScale=0
Frame=0
FrameColor=8421504
Caption="Push"
Data=Null()
Flat=0
Bitmap=[]
link(onClick,5924905:doData,[])
}
Add(DoData,9485196,875,371)
{
Data=Null()
link(onEventData,14367973:doEvent1,[])
link(Data,2161259:CurrentDir,[])
}
Add(Hub,14317570,287,203)
{
InCount=1
OutCount=2
link(onEvent1,15742840:doOff,[])
link(onEvent2,4849110:doTimer,[])
}
Add(LED,16190135,287,154)
{
@Hint=#9:Connected|
Left=5
Top=5
Width=10
Height=30
Align=0
Color=-16777201
Font=[MS Sans Serif,8,0,0,1]
ParentFont=1
Visible=0
Enabled=0
Cursor=0
KeyPreview=0
TabOrder=0
Ctl3D=0
WinStyle=2
Name=""
Hint=""
HintManager="(empty)"
Layout="(empty)"
WidthScale=0
HeightScale=0
Shape=1
Blick=1
ColorOn=65280
ColorOff=-16777201
ColorBlick=16777215
Value=1
AddHint(-23,-20,67,13,@Hint)
}
Add(Hub,6980240,833,196)
{
InCount=1
OutCount=2
link(onEvent1,11506876:doDirAction,[])
link(onEvent2,2161259:doDirAction,[(861,209)(861,321)])
}
Add(FTPC_FileSearch,2084526,959,371)
{
@Color=65535
Mask="*"
Include=2
TimeType=0
TimeFormat="D.M.Y h:m"
SmallIcon=0
FTP_Client="ftp_synol"
link(onSearch,11419913:doAdd,[])
}
Add(Memo,11419913,1022,371)
{
@Hint=#26:Листинг текущей директории|
Left=20
Top=55
Width=490
Height=250
Align=0
Color=-16777211
Font=[MS Sans Serif,8,0,0,1]
ParentFont=0
Visible=0
Enabled=0
Cursor=0
KeyPreview=0
TabOrder=0
Ctl3D=0
WinStyle=0
Name=""
Hint=""
HintManager="(empty)"
Layout="(empty)"
WidthScale=0
HeightScale=0
ModeSp=0
SizeSp=4
ColorSp=-16777201
MinOwn=0
MinRest=0
FileName=""
Strings=#
AddType=0
ScrollBars=2
ReadOnly=1
AddHint(-9,55,165,13,@Hint)
}
Add(Hub,9887956,973,315)
{
InCount=1
OutCount=2
link(onEvent1,11419913:doClear,[(1005,321)(1005,384)])
link(onEvent2,9485196:doData,[(996,328)(996,352)(863,352)(863,377)])
}
Add(Hub,14367973,917,371)
{
InCount=1
OutCount=2
link(onEvent1,2084526:doSearch,[])
link(onEvent2,5073270:doText,[(945,384)(945,421)])
}
Add(Edit,5073270,958,415)
{
@Hint=#18:Текущая директория|
Left=65
Top=30
Width=445
Height=20
Align=0
Color=-16777211
Font=[MS Sans Serif,8,0,0,1]
ParentFont=0
Visible=0
Enabled=0
Cursor=0
KeyPreview=0
TabOrder=0
Ctl3D=0
WinStyle=0
Name=""
Hint=""
HintManager="(empty)"
Layout="(empty)"
WidthScale=0
HeightScale=0
ModeSp=0
SizeSp=4
ColorSp=-16777201
MinOwn=0
MinRest=0
Text=""
Alignment=0
DataType=0
Password=1
ReadOnly=1
MaxLenField=0
ClearAfterEnter=1
AddHint(-50,36,122,13,@Hint)
}
Add(Hub,6190417,693,196)
{
@Hint=#42:Здесь все "фокусы" с перекодировками и пр.|
InCount=1
OutCount=1
link(onEvent1,10422315:doValue,[])
AddHint(-11,-60,131,26,@Hint)
}
Add(InfoTip,12489525,854,112)
{
Info=#45:Отказывается переходить в указанную папку ftp|
Font=[MS Sans Serif,8,1,0,1]
Frame=0
Transparent=0
VAlign=0
HAlign=0
Width=113
Height=130
Margin=5
}


Знаю, что проблема частая. Форум просеял, гуглил - не помогает.
Nesco, это реально починить? Может есть секрет как поступать? Или ответ уже был на форуме лет дцать назад, но тема потёрта?

Редактировалось 1 раз(а), последний 2020-03-03 19:01:16
карма: 1

0
vip
#1.1контекстная реклама от партнеров
Разработчик
Ответов: 26066
Рейтинг: 2120
#2: 2020-03-04 00:04:14 ЛС | профиль | цитата
vovcheck писал(а):
Nesco, это реально починить?

Я не могу это проверить, на моем сайте с FTP сервисом не разрешает создавать папки с пробелами, пишет -- у вас присутствуют запрещенные символы. Я без понятия как с этим бороться, у меня никогда не стояло такой задачи. Может Netspirit знает?
карма: 22

0
Ответов: 49
Рейтинг: 11
#3: 2020-03-04 11:02:45 ЛС | профиль | цитата
У нас synology. Директории и файлы туда попадают через samba, тут всё легально. Виндовый ftp-клиент справляется с ситуацией через заключение "пути в кавычки".

nesco, ваш пакет компонентов работает через WinAPI. Может я не прав, что-то не допонимаю, но если попробовать в исходнике в процедуре SetCurrentDir путь тоже заключть в кавычки?
Простите, если несу чушь.
карма: 1

0
Ответов: 4621
Рейтинг: 746
#4: 2020-03-04 12:11:22 ЛС | профиль | цитата
nesco писал(а):
Может Netspirit знает?
Тоже не могу проверить - у меня все FTP-серверы сейчас недоступны и неизвестно когда будут.
vovcheck писал(а):
но если попробовать в исходнике в процедуре SetCurrentDir путь тоже заключить в кавычки?
Так результат будет аналогичным тому что ты делал
vovcheck писал(а):
Заключение всего пути в кавычки эффекта не даёт

Предполагаю, поскольку аргументы в командах FTP отделяются пробелами, некоторые серверы могут некорректно обрабатывать такие ситуации. Но это маловероятно и не наш случай, раз виндовый клиент справляется. Значит, либо ты что-то не так заключал в кавычки, либо там ещё какой-то нюанс есть. Можешь попробовать ещё слэши перед пробелами поставить:
file\ name\ with\ space

А что там с кодировкой соединения? Попробуй имена каталогов и файлов сделать английскими символами и проверь.

Редактировалось 2 раз(а), последний 2020-03-04 12:13:59
карма: 26

0
Ответов: 49
Рейтинг: 11
#5: 2020-03-04 12:20:00 ЛС | профиль | цитата
Пути латиницей с пробелами, без кавычек - ОК,
кириллицей без кавычек - ОК,
кириллицей с пробелами, с кавычками и без кавычек - облом.

Слэши и %20 не помогают.

--- Добавлено в 2020-03-04 12:26:32

Кстати, кириллицей с кавычками тоже облом.
Не в кавычках решение.

Редактировалось 3 раз(а), последний 2020-03-04 12:26:32
карма: 1

0
Ответов: 4621
Рейтинг: 746
#6: 2020-03-04 12:38:17 ЛС | профиль | цитата
Проблема в кодировке. Конвертируй пути в UTF-8 с/без кавычек.

Редактировалось 2 раз(а), последний 2020-03-04 12:39:26
карма: 26

0
Ответов: 49
Рейтинг: 11
#7: 2020-03-04 13:07:25 ЛС | профиль | цитата
Ещё вчера проверил - не работает. Начал просто перебор всех методик.

Ещё наблюдение. Скопировал путь из filesilla
/Proxy/PROGPROXY/Порубежье

Вставил в Edit, клиент не принимает.
Вставил в RichEdit - переходит и листингует.

То же самое с другим путём,
/Proxy/PROGPROXY/Академия
Не работают оба.

В случаях
/Proxy/PROGPROXY/Эрмитаж
/Proxy/PROGPROXY/Эрмитаж 250
работают оба.

Я начинаю понимать, что проблема может в доп символах в названиях. Может там применены неразрывные пробелы или другая хрень? Буду исследовать.

О результатах доложу сюда.
nesco, Netspirit, спасибо вам обоим.
карма: 1

0
Ответов: 49
Рейтинг: 11
#8: 2020-03-04 15:18:21 ЛС | профиль | цитата
nesco, Netspirit, нашелся источник проблемы!

В названии путей, куда ftp-клиент не вхож, присутствует "я", hex=0xFF
карма: 1

0
Ответов: 4621
Рейтинг: 746
#9: 2020-03-04 15:45:21 ЛС | профиль | цитата
А виндовый клиент в эти пути?
Кроме того, может кодировка там не UTF-8, а какая-то другая (типа KOI-8 или не-кириллическая). Посмотри в настройках FTP-сервера и самой ОС. Посмотри логи клиента FileZilla - возвращает ли сервер название кодировки.

Редактировалось 2 раз(а), последний 2020-03-04 15:49:33
карма: 26

0
Ответов: 49
Рейтинг: 11
#10: 2020-03-04 16:39:12 ЛС | профиль | цитата
Там на сервере UTF-8, filezilla, winscp ходят без проблем.
Виндовый клиент не хочет "я", работает через 1251 отображая в 866.

я (0xFF) совпадает со служебным словом в самом ftp-протоколе.
Я пока в поиске...

--- Добавлено в 2020-03-04 17:01:03

Решение найдено!

Оказывается раз 0xFF - внутренняя для ftp протокола команда, то (как это сделано в FARmanager) дублирование исправляет ситуацию.

То есть, если надо войти в /Для тестов надо всего лишь набрать /Дляя тестов.

Netspirit, спасибо. Заголовок указал неверный.
nesco, компоненты нормальные.
Простите, что отнял время.

Тема, полагаю, закрыта.

Редактировалось 2 раз(а), последний 2020-03-04 17:01:03
карма: 1

0
10
Сообщение
...
Прикрепленные файлы
(файлы не залиты)