您好我正在开发一个连接到远程服务器并浏览不同目录的应用程序。
这里我只想向用户显示目录和文本文件。在JSch中使用SFTP通道,我可以执行ls
方法。但是这种方法可以以"*"
或"*.txt"
这种格式给出结果。单独使用ls
我可以获得目录列表和文本文件列表。由于我单独使用它,我必须使用两种不同的ls
方法,如:
sftpChannel.ls("*");
sftpChannel.ls("*.txt");
1st给了我所有条目,我必须循环和过滤目录。第二,我得到所有文本文件。
如何使用最少的代码获取目录列表和文本文件列表。我不想循环两次。感谢
答案 0 :(得分:3)
使用ls("")
。然后循环返回的条目,并只选择你想要的那些。
即。那些LsEntry.getFilename()
以".txt"
或LsEntry.getAttrs().isDir()
结尾的人。
答案 1 :(得分:0)
We can use like this, read directories and files also.
public List<String> readRemoteDirectory(String location){
System.out.println("Reading location : "+location);
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
List<String> filesList = new ArrayList<String>();
String separator = getSeparator();
try{
JSch jsch = new JSch();
session = jsch.getSession(remote_server_user,remote_server_ip,22);
session.setPassword(remote_server_password);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
config.put("PreferredAuthentications", "publickey,keyboard-interactive,password");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp)channel;
channelSftp.cd(location);
Vector filelist = channelSftp.ls("*");
for(int i=0; i<filelist.size();i++){
LsEntry entry = (LsEntry) filelist.get(i);
if (".".equals(entry.getFilename()) || "..".equals(entry.getFilename())) {
continue;
}
if(entry.getAttrs().isDir()){
System.out.println(entry.getFilename());
//System.out.println("Entry"+location+separator+entry.getAttrs());
filesList.add(entry.getFilename());
}
}
}catch(Exception ex){
ex.printStackTrace();
logger.debug(ex.getMessage());
if(ex.getMessage().equals("No such file")){
logger.debug("No Such File IF");
}
}finally{
channel.disconnect();
session.disconnect();
}
return filesList;
}