[JSch-users] Sftp support for lsFiles
Status: Alpha
Brought to you by:
ymnk
From: Anil S. <as...@lu...> - 2005-04-19 14:20:29
|
Hi The current version of ls returns, the raw output of the directory, which I need to further parse, I see that the code already has the capability of construction a "SftpFile" object which can contain the necessary filename, raw listing and the file attributes for each file/directory, can support for such a capability be added I've for my own added the following modified version of lsFiles in public SftpFile[] lsFiles(String path) throws SftpException{ try{ if(!path.startsWith("/")){ path=cwd+"/"+path; } String dir=path; byte[] pattern=null; if(!isRemoteDir(dir)){ int foo=path.lastIndexOf('/'); dir=path.substring(0, foo); pattern=path.substring(foo+1).getBytes(); } /* send an open dir command to the remote server. */ sendOPENDIR(dir.getBytes()); buf.rewind(); int i=io.in.read(buf.buffer, 0, buf.buffer.length); /* read length and type */ int length=buf.getInt(); int type=buf.getByte(); if(type!=SSH_FXP_STATUS && type!=SSH_FXP_HANDLE){ throw new SftpException(SSH_FX_FAILURE, ""); } if(type==SSH_FXP_STATUS){ buf.getInt(); i=buf.getInt(); throwStatusError(buf, i); } buf.getInt(); byte[] handle=buf.getString(); // filename ArrayList v = new ArrayList(); while(true){ sendREADDIR(handle); buf.rewind(); i=io.in.read(buf.buffer, 0, buf.buffer.length); buf.index=i; length=buf.getInt(); length=length-(i-4); type=buf.getByte(); if(type!=SSH_FXP_STATUS && type!=SSH_FXP_NAME){ throw new SftpException(SSH_FX_FAILURE, ""); } if(type==SSH_FXP_STATUS){ break; } buf.getInt(); int count=buf.getInt(); byte[] str; int flags; while(count>0){ if(length>0){ buf.shift(); i=io.in.read(buf.buffer, buf.index, buf.buffer.length-buf.index); if(i<=0)break; buf.index+=i; length-=i; } byte[] filename=buf.getString(); //System.out.println("filename: "+new String(filename)); str=buf.getString(); String longname=new String(str); // System.out.println("longname: "+longname); SftpATTRS attrs=SftpATTRS.getATTR(buf); //System.out.println("filename" + new String(filename) + " time=" + attrs.getMTime()); if(pattern==null || Util.glob(pattern, filename)){ v.add(new SftpFile(new String(filename), longname, attrs)); // v.addElement(new Ssh_exp_name(new String(filename), longname, attrs)); } count--; } } sendCLOSE(handle); buf.rewind(); i=io.in.read(buf.buffer, 0, buf.buffer.length); length=buf.getInt(); type=buf.getByte(); if(type!=SSH_FXP_STATUS){ throw new SftpException(SSH_FX_FAILURE, ""); } buf.getInt(); i=buf.getInt(); if(i==SSH_FX_OK) { return (SftpFile[])v.toArray(new SftpFile[0]); } throwStatusError(buf, i); } catch(Exception e){ if(e instanceof SftpException) throw (SftpException)e; throw new SftpException(SSH_FX_FAILURE, ""); } return new SftpFile[0]; } |