Разные разделители путей во время FTP-транзакции между Windows и Linux

#java #ftp

#java #ftp

Вопрос:

Я загружаю файл через FTP на сервер Linux. Я использую Apache FTPClient .

Итак, допустим, я хотел загрузить файл C:\downloads\13\myFile.txt на сервер по адресу /data/downloads/13/myFile.txt

Перед загрузкой я определяю, существует ли каталог, в который он будет отправлен listFiles .

Когда я говорю

 ftp.listFiles("/data/downloads/13");
  

Я получаю массив, содержащий один файловый объект, что означает, что путь существует (и мне не нужно создавать папку). Однако, когда я говорю

 ftp.listFiles("\data\downloads\13");
  

Я получаю пустой массив, означающий, что путь не существует.

Причина этого в том, что я запускаю свое приложение с компьютера под управлением Windows, поэтому разделитель путей отличается.

Решение, которое я выбрал, состоит в том, чтобы нормализовать пути, заменив на / , прежде чем я продолжу FTP-транзакции.

Является ли это правильным способом решения этой проблемы?

Комментарии:

1. @PeterLawrey Я несколько обеспокоен возможностью того, что кто-то действительно меняет сервер на что-то, что не принимает / , а затем сообщает мне, что мой код поврежден! Только немного, потому что я не думаю, что такая система существует.

2. @PeterLawrey FTP предоставляет абстрактное представление некоторой файловой системы, поэтому разделителем является «/», потому что это то, что определяет протокол FTP, а не то, что ожидает хост-ОС (даже если вы запускаете какой-либо FTP-сервер в Windows, это «/»)

3. @GyroGearless Спасибо за исправление. Все операционные системы в любом случае должны подавать в суд на ‘/’. 😉

Ответ №1:

Из RFC 959:

имя пути

      Pathname is defined to be the character string which must be
     input to a file system by a user in order to identify a file.
     Pathname normally contains device and/or directory names, and
     file name specification.  FTP does not yet specify a standard
     pathname convention.  Each user must follow the file naming
     conventions of the file systems involved in the transfer.
  

Поскольку стандарта имен путей не существует, FTP-сервер может при желании использовать соглашения об именах путей своей локальной файловой системы. Возможно, вы захотите отправить запрос SYST на сервер, прежде чем изменять свой путь, если вы собираетесь подключиться к любому другому серверу.

 4.1.3.  FTP SERVICE COMMANDS
     ...
     SYSTEM (SYST)

            This command is used to find out the type of operating
            system at the server.  The reply shall have as its first
            word one of the system names listed in the current version
            of the Assigned Numbers document [4].
  

Команда SYST не требуется для минимальной реализации FTP-сервера, поэтому эта команда может быть не распознана некоторыми серверами. Но если команда была реализована, это позволит вам изменить свой путь, чтобы он был совместим. Вот 5 примеров ответов, которые вы можете получить:

  215 UNIX Type: L8
 215 UNIX Type: L8 Version: BSD-44
 215 NetWare system type.
 215 MACOS Peter's Server
 215 AmigaOS
  

Из документации Apache FTPClient, на которую вы ссылались, я полагаю, что функция, которая отправляет запрос SYST, хотя я не знаком с Java и этим клиентом Apache: getSystemType .

И, наконец, пример.

Но да, если сервер поддерживает только путь UNIX, вам придется преобразовать ваш путь Windows из » в ‘/’.

Ответ №2:

Это правильный способ использовать ‘ /’, но не понимаю, почему вы хотите заменить разделитель путей перед FTP-транзакциями.Но вы работаете из Windows, вы можете указать полный путь к файлу Windows в качестве источника с помощью ‘ /’, и вы можете использовать «/ data / downloads / 13» в качестве цели.

Предоставьте дополнительные разъяснения, если я неправильно понял.

Комментарии:

1. Разделитель путей заменяется / нормализуется, поскольку целевая папка создается из исходной папки, в которой используются разделители путей в стиле Windows.