sftpconnection.java

来自「一个JAVA做的FTP软件,带源码的,可以很好的进行二次开发,,并带有详细说明文」· Java 代码 · 共 1,080 行 · 第 1/2 页

JAVA
1,080
字号
        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);        }        return 0;    }    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        {	    //Log.debug("aaa");            BufferedOutputStream out = null;            SftpFile inf = null;            SftpFile of = null;            boolean outflag = false;	                BufferedInputStream in = null;            if(up)            {	    	in = new BufferedInputStream(new FileInputStream(file));            }            else            {                inf = sftp.openFile(file, R);                in = new BufferedInputStream(new SftpFileInputStream(inf));            }            if(up)            {                outflag = true;		//FileAttributes fa = new FileAttributes();		//fa.setPermissions("rwxr--r--");		//fa.setSize(new UnsignedInteger64(		//	new java.math.BigInteger(""+new File(file).length())));                of = sftp.openFile(outfile, W);		of.delete();		                of = sftp.openFile(outfile, RW); // , fa);		                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);            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);                }            }	    //if(up) 	    //{	    	//byte[] fin = new byte[1];	    	//fin[0] = (byte) -1;	    	//out.write((byte[])-1,0,1);	    //}	                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);        }    }    public void rename(String oldName, String newName)    {        try        {            oldName = toSFTP(oldName);            newName = toSFTP(newName);            SftpFile f = sftp.openFile(oldName, RW);            f.rename(newName);        }        catch(Exception ex)        {            ex.printStackTrace();            Log.debug("Could rename file (" + ex + ").");        }    }    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)    {        if(listeners == null)        {            return;        }        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);            }        }    }    public int upload(String file, InputStream i)    {        try        {            file = toSFTP(file);            SftpFile of = sftp.openFile(file, RW);	    //of.delete();	              //of = sftp.openFile(file, RW);              sftp.changePermissions(of, "rwxr--r--");            BufferedOutputStream out = new BufferedOutputStream(new SftpFileOutputStream(of));            BufferedInputStream in = new BufferedInputStream(i);            //Log.debug(getLocalPath() + ":" + file+ ":"+getPWD());            byte[] buf = new byte[smbBuffer];            int len = 0;            int reallen = 0;            while(true)            {                len = in.read(buf);                //System.out.print(".");                if(len == StreamTokenizer.TT_EOF)                {                    break;                }                out.write(buf, 0, len);                reallen += len;                fireProgressUpdate(StringUtils.getFile(file),                                   DataConnection.PUT, reallen);            }	    byte fin[] = new byte[1];	    fin[0] = -1;	    out.write(fin,0,1);	                out.flush();            out.close();            in.close();            fireProgressUpdate(file, DataConnection.FINISHED, -1);            return 0;        }        catch(IOException ex)        {            //ex.printStackTrace();            Log.debug("Error with file IO (" + ex + ")!");            fireProgressUpdate(file, DataConnection.FAILED, -1);            return -1;        }    }    public InputStream getDownloadInputStream(String file)    {        try        {            file = toSFTP(file);            SftpFile inf = sftp.openFile(file, R);            return new SftpFileInputStream(inf);        }        catch(IOException ex)        {            ex.printStackTrace();            Log.debug(ex.toString() +                      " @SftpConnection::getDownloadInputStream");            return null;        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?