📄 sftpconnection.java
字号:
} public void handleDownload(String f) { if(Settings.getEnableSftpMultiThreading()) { SftpTransfer t = new SftpTransfer(host, getLocalPath(), getPWD(), f, user, pass, listeners, Transfer.DOWNLOAD); } else { download(f); } } public void upload(String f) { String file = toSFTP(f); if(file.endsWith("/")) { String out = StringUtils.getDir(file); uploadDir(file, getLocalPath() + out); fireActionFinished(this); } else { String outfile = StringUtils.getFile(file); //System.out.println("transfer: " + file + ", " + getLocalPath() + outfile); work(getLocalPath()+outfile, file, true); fireActionFinished(this); } } public void download(String f) { String file = toSFTP(f); if(file.endsWith("/")) { String out = StringUtils.getDir(file); downloadDir(file, getLocalPath() + out); fireActionFinished(this); } else { String outfile = StringUtils.getFile(file); //System.out.println("transfer: " + file + ", " + getLocalPath() + outfile); work(file, getLocalPath()+outfile, false); fireActionFinished(this); } } private void downloadDir(String dir, String out) { try { //System.out.println("downloadDir: " + dir + "," + out); fileCount = 0; shortProgress = true; baseFile =StringUtils.getDir(dir) ; SftpFile f2 = sftp.openDirectory(dir); Vector v = new Vector(); while(sftp.listChildren(f2, v) > 0); String tmp[] = new String[v.size()]; SftpFile f[] = new SftpFile[v.size()]; Enumeration e = v.elements(); int x = 0; while(e.hasMoreElements()) { f[x] = ((SftpFile) e.nextElement()); tmp[x] = f[x].getFilename(); Log.debugRaw("."); if(f[x].isDirectory() && !tmp[x].endsWith("/")) tmp[x] = tmp[x] + "/"; sftp.closeFile(f[x]); x++; } sftp.closeFile(f2); File fx = new File(out); fx.mkdir(); for(int i=0; i<tmp.length; i++) { if(tmp[i].equals("./") || tmp[i].equals("../")) continue; tmp[i] = tmp[i].replace('\\','/'); //System.out.println("1: " + dir+tmp[i] + ", " + out +tmp[i]); SftpFile f3 = sftp.openFile(dir+tmp[i], R); if(f3.isDirectory()) { if(!tmp[i].endsWith("/")) tmp[i] = tmp[i] + "/"; downloadDir(dir+tmp[i], out + tmp[i]); } else { fileCount++; fireProgressUpdate(baseFile,DataConnection.GETDIR + ":" + fileCount, -1); work(dir +tmp[i], out + tmp[i], false); } sftp.closeFile(f3); } fireProgressUpdate(baseFile,DataConnection.DFINISHED + ":" + fileCount, -1); } catch(Exception ex) { ex.printStackTrace(); System.out.println(dir + ", " + out); Log.debug("Transfer error: " + ex); fireProgressUpdate(baseFile,DataConnection.FAILED + ":" + fileCount, -1); } shortProgress = false; } private void uploadDir(String dir, String out) { try { //System.out.println("uploadDir: " + dir + "," + out); isDirUpload = true; fileCount = 0; shortProgress = true; baseFile =StringUtils.getDir(dir) ; File f2 = new File(out); String tmp[] = f2.list(); if(tmp == null) return; sftp.makeDirectory(dir); sftp.changePermissions(dir, "rwxr--r--"); for(int i=0; i<tmp.length; i++) { if(tmp[i].equals("./") || tmp[i].equals("../")) continue; tmp[i] = tmp[i].replace('\\','/'); //System.out.println("1: " + dir+tmp[i] + ", " + out +tmp[i]); File f3 = new File(out+tmp[i]); if(f3.isDirectory()) { if(!tmp[i].endsWith("/")) tmp[i] = tmp[i] + "/"; uploadDir(dir+tmp[i], out + tmp[i]); } else { fileCount++; fireProgressUpdate(baseFile,DataConnection.PUTDIR + ":" + fileCount, -1); work(out +tmp[i], dir + tmp[i], true); } } fireProgressUpdate(baseFile,DataConnection.DFINISHED + ":" + fileCount, -1); } catch(Exception ex) { ex.printStackTrace(); System.out.println(dir + ", " + out); Log.debug("Transfer error: " + ex); fireProgressUpdate(baseFile,DataConnection.FAILED + ":" + fileCount, -1); } isDirUpload = false; shortProgress = true; } private String toSFTP(String f) { String file; if(f.startsWith("/")) file = f; else file = getPWD()+f; file = file.replace('\\','/'); //System.out.println("file: "+file); return file; } private String toSFTPDir(String f) { String file; if(f.startsWith("/")) file = f; else file = pwd+f; file = file.replace('\\','/'); if(!file.endsWith("/")) file = file + "/"; //System.out.println("file: "+file); return file; } private void work(String file, String outfile, boolean up) { try { BufferedOutputStream out = null; SftpFile inf = null; SftpFile of = null; boolean outflag = false; if(up) { outflag = true; of = sftp.openFile(outfile, RW); sftp.changePermissions(of, "rwxr--r--"); out = new BufferedOutputStream(new SftpFileOutputStream(of)); } else out = new BufferedOutputStream(new FileOutputStream(outfile)); //System.out.println("out: " + outfile + ", in: " + file); BufferedInputStream in = null; if(!up) { inf = sftp.openFile(file, R); in = new BufferedInputStream(new SftpFileInputStream(inf)); } else in = new BufferedInputStream(new FileInputStream(file)); byte buf[] = new byte[smbBuffer]; int len = 0; int reallen = 0; //System.out.println(file+":"+getLocalPath()+outfile); while(true) { len = in.read(buf); //System.out.print("."); if(len == StreamTokenizer.TT_EOF) break; out.write(buf,0,len); reallen += len; //System.out.println(file + ":" + StringUtils.getFile(file)); if(outflag) fireProgressUpdate(StringUtils.getFile(outfile),DataConnection.PUT , reallen); else fireProgressUpdate(StringUtils.getFile(file),DataConnection.GET, reallen); } out.flush(); out.close(); in.close(); /* if(of != null) { sftp.closeFile(of); } */ fireProgressUpdate(file,DataConnection.FINISHED, -1); } catch(IOException ex) { //ex.printStackTrace(); Log.debug("Error with file IO ("+ex+")!"); fireProgressUpdate(file,DataConnection.FAILED, -1); } } private void update(String file, String type, int bytes) { if(listeners == null) return; else { for(int i=0; i<listeners.size(); i++) { ConnectionListener listener = (ConnectionListener) listeners.elementAt(i); listener.updateProgress(file, type, bytes); } } } public void addConnectionListener(ConnectionListener l) { listeners.add(l); } public void setConnectionListeners(Vector l) { listeners = l; } /** remote directory has changed */ public void fireDirectoryUpdate() { if(listeners == null) return; else { for(int i=0; i<listeners.size(); i++) { ((ConnectionListener)listeners.elementAt(i)).updateRemoteDirectory(this); } } } public boolean login(String user, String pass) { this.user = user; this.pass = pass; if(!login()) { Log.debug("Login failed."); return false; } else { Log.debug("Authed successfully."); //if(!chdir(getPWD())) chdir("/"); } return true; } /** progress update */ public void fireProgressUpdate(String file, String type, int bytes) { //System.out.println(listener); if(listeners == null) return; else { for(int i=0; i<listeners.size(); i++) { ConnectionListener listener = (ConnectionListener) listeners.elementAt(i); if(shortProgress && Settings.shortProgress) { if(type.startsWith(DataConnection.DFINISHED)) { listener.updateProgress( baseFile, DataConnection.DFINISHED+":"+fileCount, bytes); } else if(isDirUpload) listener.updateProgress( baseFile, DataConnection.PUTDIR+":"+fileCount, bytes); else listener.updateProgress( baseFile, DataConnection.GETDIR+":"+fileCount, bytes); } else listener.updateProgress(file, type, bytes); } } } public void fireActionFinished(SftpConnection con) { if(listeners == null) return; else { for(int i=0; i<listeners.size(); i++) { ((ConnectionListener)listeners.elementAt(i)).actionFinished(con); } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -