Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Проблемы при работе с commons- vfs |
Автор: LSD 31.1.2007, 14:02 | ||||||||||
Взаимодействие 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) У нас есть http://apache.easy-webs.de/jakarta/commons/net/source/commons-net-1.4.1-src.zip 2)Скачиваем распаковываем, берем оттуда файл DefaultFTPFileEntryParserFactory.java 3)Открываем и правим: находим строку
меняем ее на
4)Компилируем класс 5)У нас есть http://apache.easy-webs.de/jakarta/commons/net/binaries/commons-net-1.4.1.zip, распаковываем, заходим в jar архив, и соответственно меняем класс DefaultFTPFileEntryParserFactory.class на аналогичный только что скомпиленный. 6) Выходим из jar архива, кидаем его в CLASSPATH, все как обычно. Готово. Теперь наш пакет понимает сервера с файловой системой обозначаемой WIN32 A N и код прекрасно работает с прекрасным Small Http Server `ом. Это было описание того что проделано для понимания. Если же кто то не хочет возиться с переделыванием, можно взять готовый jar архив http://forum.vingrad.ru/index.php?act=module&module=vingradfaq&target=download_file&articleid=3089&attachid=1 Автор статьи: http://forum.vingrad.ru/index.php?showuser=777&nickname=zone51 Благодарности: http://forum.vingrad.ru/index.php?showuser=777&nickname=w1nd, который собственно и является автором идеи. |