![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| zone51 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 17.2.2006 Репутация: 1 Всего: 1 |
Уважаемые форумчане, помогите пожалуйста решить проблему которую я никак не могу разрулить.
Есть код который копирует папку с фтп сервера на локальный диск
Есть сервер Small Http Server на котором по ходу виндовая фс. Код выдает:
То есть не понимает виндовую фс. Тем не менее в FAQ написано:
Я не могу понять в чем косяк. Ну не может же такого быть чтоб не пахало. Значит трабл или с серваком или с самой vfs я имею ввиду билд. Я использую один из ночных билдов может они заточены под линь? Хотя смысла что то не вижу. зы. Извините за факический дубликат темы, но я близок к отчаянию. Спасибо всем кто откликнется. -------------------- The truth is out there |
||||||
|
|||||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 2 Всего: 54 |
Максимум, что сейчас пришло в голову - заменить класс org.apache.commons.net.ftp.parser.DefaultFTPFileEntryParserFactory своим и для такого ключа ("WIN32 A N") конструировать org.apache.commons.net.ftp.parser.NTFTPEntryParser.
Вот еще вариант (непроверенный): получить корневой объект ftp-шной файловой системы (если, конечно, vfs сразу не полезет листить файлы), добраться с его помощью до FtpFileSystem, получить у той FTPClient и сказать ему setParserFactory() с нужной вам фабрикой. Для "WIN32 N A" в ftp-клиенте просто нет парсеров. Есть только для "WINDOWS". Это сообщение отредактировал(а) w1nd - 29.1.2007, 16:06 -------------------- ![]() ![]() |
|||
|
||||
| zone51 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 17.2.2006 Репутация: 1 Всего: 1 |
w1nd,
Спасибо что ответили, а можно поподробнее как это сделать? Я имею ввиду
Спасибо. -------------------- The truth is out there |
||||
|
|||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 19 Всего: 538 |
Попробуй так:
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 2 Всего: 54 |
..
Это сообщение отредактировал(а) w1nd - 29.1.2007, 18:35 -------------------- ![]() ![]() |
|||
|
||||
| zone51 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 17.2.2006 Репутация: 1 Всего: 1 |
LSD,
Спасибо. Ошибка совершенно та же самая. Добавлено @ 18:52 Кстати хочу заметить код
Работает нормально а вот без строчки
Выдает аналогичную ошибку. Это я еще когда делал на commons.net Может это вам как то поможет. Спасибо. Это сообщение отредактировал(а) zone51 - 29.1.2007, 18:57 -------------------- The truth is out there |
||||||
|
|||||||
| w1nd |
|
||||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 2 Всего: 54 |
В принципе, есть вполне "законный" способ указать EntryParser или EntryParserFactory:
И всё было бы хорошо, если бы ftp-шный провайдер эти установки не игнорировал Опять же, вполне "законным" способом можно подменить FtpFileProvider, но для этого придется делать свои версии практически половины его классов. Это сообщение отредактировал(а) w1nd - 29.1.2007, 23:59 -------------------- ![]() ![]() |
||||
|
|||||
| zone51 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 17.2.2006 Репутация: 1 Всего: 1 |
w1nd,
Спасибо, попробовал-та же ботва -------------------- The truth is out there |
|||
|
||||
| zone51 |
|
||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 17.2.2006 Репутация: 1 Всего: 1 |
Взаимодействие org.apache.commons.vfs и некоторых FTP серверов
Внимание! В данной заметке приведено решение наболевшей одно время проблемы. Все FTP сервера, функционирующие в сетях или Интернет делятся на несколько типов в зависимости от типа файловой системы их жестких дисков. Такое разделение связано с типом операционной системы которая установлена на сервере. У операционных систем разных семейств разные подходы к представлению данных на диске. Например в операционных системах семейства Unix разделительной чертой(сепаратором), с помощью которой формируются пути к файлам на диске является символ "/", в Windows наоборот - "\". Поэтому клиент который обращается к фтп серверу должен знать какого типа ФС сервера чтобы знать как правильно искать файлы, и передавать из пользователю. Большинство серверов имеют тип файловой системы Unix, многие сервера имеют тип файловой системы Windows есть также сервера со специфическими свойствами, касающимися взаимодействий с различными FTP клиентами. Чтобы клиент мог понять с каким сервером он имеет дело, сервер дает клиенту некоторые сведения о себе. Среди прочей информации сервер передает клиенту описание своей файловой системы. Если это Unix ФС то этим описанием будет что то вроде "UnixFS" или еще что то. Для серверов с ФС Windows этим описанием будет строка "WINDOWS" или что то в этом роде. Чтобы правильно распознавать ФС и работать с файлами на ней существуют специальные средства-парсеры (англ. parse-анализ, разбор). Они отвечают за "понимание" файловой системы сервера и работу с ней. В пакете org.apache.commons.net, без которого не может работать org.apache.commons.vfs, и который отвечает за работу с сетевыми ресурсами, запрограммированы парсеры под самые распространенные типы файловых систем. Но как оказалось не под все. Файловая система с опианием Win32 A N оказалась "непонятной" для пакета. А следовательно для этой ФС неприменим ни org.apache.commons.vfs. ни org.apache.commons.net. Что делать? Рассмотрим пример. Задача: скопировать папку с FTP сервера на локальный диск но с помощью org.apache.commons.vfs так как на мой взгляд это элегантное и функциональное решение. FTP Сервер: Small HTTP Server. Я использую его для тестирования многие годы. Ничего лучше я пока не видел. FTP Клиент: Простое консольное Java приложение. Его исходный код:
При попытке запустить этот код возникает ошибка:
Ключевая фраза в последнем фрагменте:
Решение: 1) У нас есть сырцы org.apache.commons.net 2)Скачиваем распаковываем, берем оттуда файл DefaultFTPFileEntryParserFactory.java 3)Открываем и правим: находим строку
меняем ее на
4)Компилируем класс 5)У нас есть бинарник org.apache.commons.net, распаковываем, заходим в jar архив, и соответственно меняем класс DefaultFTPFileEntryParserFactory.class на аналогичный только что скомпиленный. 6) Выходим из jar архива, кидаем его в CLASSPATH, все как обычно. Готово. Теперь наш пакет понимает сервера с файловой системой обозначаемой WIN32 A N и код прекрасно работает с прекрасным Small Http Server `ом. Это было описание того что проделано для понимания. Если же кто то не хочет возиться с переделыванием, можно взять готовый jar архив Здесь Автор статьи: ZONE51 Благодарности: W1nd, который собственно и является автором идеи. зы. Прошу модератора поместить статью в раздел FAQ и перезалить с рапиды на форум модифицированный архив -------------------- The truth is out there |
||||||||||
|
|||||||||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |