gpt4 book ai didi

java - org.apache.commons.net.ftp.FTPClient listFiles() 问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:44 24 4
gpt4 key购买 nike

org.apache.commons.net.ftp.FTPClientlistFiles() 方法在 127.0.0.1 上的 Filezilla 服务器上工作正常,但返回 null 在公共(public) FTP 服务器的根目录,例如 belnet.be。

下面的链接中有一个相同的问题,但 enterRemotePassiveMode() 似乎没有帮助。 Apache Commons FTPClient.listFiles

会不会是列表解析的问题?如果是这样,如何解决这个问题?

编辑:这是一个目录缓存转储:

FileZilla 目录缓存转储

正在转储 1 个缓存目录

Entry 1:
Path: /
Server: anonymous@ftp.belnet.be:21, type: 4096
Directory contains 7 items:
lrw-r--r-- ftp ftp D 28 2009-06-17 debian
lrw-r--r-- ftp ftp D 31 2009-06-17 debian-cd
-rw-r--r-- ftp ftp 0 2010-03-04 13:30 keepalive.txt
drwxr-xr-x ftp ftp D 4096 2010-02-18 14:22 mirror
lrw-r--r-- ftp ftp D 6 2009-06-17 mirrors
drwxr-xr-x ftp ftp D 4096 2009-06-23 packages
lrw-r--r-- ftp ftp D 1 2009-06-17 pub

这是我使用我制作的包装器的代码(在包装器内部测试产生相同的结果):

public static void main(String[] args) {        
FTPUtils ftpUtils = new FTPUtils();
String ftpURL = "ftp.belnet.be";
Connection connection = ftpUtils.getFTPClientManager().getConnection( ftpURL );

if( connection == null ){
System.out.println( "Could not connect" );
return;
}

FTPClientManager manager = connection.getFptClientManager();
FTPClient client = manager.getClient();

try {
client.enterRemotePassiveMode();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

if( connection != null ){
System.out.println( "Connected to FTP" );
connection.login("Anonymous", "Anonymous");
if( connection.isLoggedIn() ){
System.out.println( "Login successful" );
LoggedInManager loggedin = connection.getLoggedInManager();
System.out.println( loggedin );
String[] fileList = loggedin.getFileList();

System.out.println( loggedin.getWorkingDirectory() );

if( fileList == null || fileList.length == 0 )
System.out.println( "No files found" );
else{
for (String name : fileList ) {
System.out.println( name );
}
}

connection.disconnect();

if( connection.isDisconnected() )
System.out.println( "Disconnection successful" );
else
System.out.println( "Error disconnecting" );
}else{
System.out.println( "Unable to login" );
}
} else {
System.out.println( "Could not connect" );
}
}

产生这个输出:

Connected to FTP
Login succesful
utils.ftp.FTPClientManager$Connection$LoggedInManager@156ee8e
null
No files found
Disconnection successful

包装器内部(尝试同时使用 listNames()listFiles() ):

        public String[] getFileList() {
String[] fileList = null;
FTPFile[] ftpFiles = null;

try {
ftpFiles = client.listFiles();
//fileList = client.listNames();
//System.out.println( client.listNames() );
} catch (IOException e) {
return null;
}

fileList = new String[ ftpFiles.length ];

for( int i = 0; i < ftpFiles.length; i++ ){
fileList[ i ] = ftpFiles[ i ].getName();
}

return fileList;
}

对于FTPClient,处理如下:

public class FTPUtils {

private FTPClientManager clientManager;

public FTPClientManager getFTPClientManager(){
clientManager = new FTPClientManager();
clientManager.setClient( new FTPClient() );

return clientManager;
}

最佳答案

每个 FTP 服务器都有不同的文件列表布局(是的,它不是 FTP 标准的一部分,它很笨),因此您必须使用正确的 FTPFileEntryParser,或者通过手动指定,或允许 CommonsFTP 自动检测它。

自动检测通常可以正常工作,但有时不能,您必须明确指定它,例如

FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);

FTPClient client = FTPClient();
client.configure(conf);

这明确地将预期的 FTP 服务器类型设置为 UNIX。尝试各种类型,看看效果如何。我试着自己找出答案,但是 ftp.belnet.be 拒绝我的连接:(

关于java - org.apache.commons.net.ftp.FTPClient listFiles() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2576647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com