Java windows和linux之间FTP事务期间的不同路径分隔符

Java windows和linux之间FTP事务期间的不同路径分隔符,java,ftp,Java,Ftp,我正在通过FTP将文件上载到Linux服务器。我使用Apache的 假设我想将文件C:\\downloads\\13\\myFile.txt上传到服务器/data/downloads/13/myFile.txt 在上传之前,我使用listFiles确定将发送到的目录是否存在 当我说 ftp.listFiles("/data/downloads/13"); 我得到一个包含一个文件对象的数组,这意味着路径存在(我不需要创建文件夹)。但是当我说 ftp.listFiles("\\data\\down

我正在通过FTP将文件上载到Linux服务器。我使用Apache的

假设我想将文件
C:\\downloads\\13\\myFile.txt
上传到服务器
/data/downloads/13/myFile.txt

在上传之前,我使用
listFiles
确定将发送到的目录是否存在

当我说

ftp.listFiles("/data/downloads/13");
我得到一个包含一个文件对象的数组,这意味着路径存在(我不需要创建文件夹)。但是当我说

ftp.listFiles("\\data\\downloads\\13");
我得到一个空数组,这意味着路径不存在

这是因为我在Windows机器上运行应用程序,所以路径分隔符是不同的

我决定的解决方案是在继续FTP事务之前,通过将
\
替换为
/
来规范路径


这是解决此问题的正确方法吗?

这是使用“/”的正确方法,但不知道为什么要在FTP事务之前替换路径分隔符。但是您是从windows运行的,您可以使用“/”作为源提供windows文件的完整路径,并且可以使用“/data/downloads/13”作为目标

如果我误解了,请提供更多说明。

来自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请求。


最小FTP服务器实现不需要SYST命令,因此某些服务器可能无法识别此命令。但是,如果该命令已经实现,它将允许您修改路径名以使其兼容。以下是您可能收到的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客户端:

最后是一个


但是,如果服务器仅支持UNIX路径名,则必须将Windows路径名从“\”转换为“/”。

路径分隔符被替换/规范化,因为目标文件夹是从源文件夹生成的,它使用windows风格的路径分隔符。@PeterLawrey我有点担心有人确实将服务器更改为不接受
/
的服务器,然后告诉我我的代码被破坏了!只是在某种程度上,因为我认为不存在这样的系统。@PeterLawrey FTP提供了某个文件系统的抽象视图,所以分隔符是“/”,因为这是FTP协议定义的,而不是主机操作系统期望的(即使您在Windows上运行某个FTP服务器,它也是“/”@Gyrogeerless感谢您的更正。所有操作系统都应该起诉“/”。)
 215 UNIX Type: L8
 215 UNIX Type: L8 Version: BSD-44
 215 NetWare system type.
 215 MACOS Peter's Server
 215 AmigaOS