2014-03-25 119 views
0

我想在下載它之前獲取文件大小,以便我可以將其用於進度條。我找到了這個Post,但找不到確切的命令來獲取文件大小.Plz幫助!使用Jsch獲取文件大小fron Unix遠程服務器

+0

它看起來像答案是正確的,在這個問題的答案。當您嘗試使用建議的代碼時發生了什麼? –

+0

@Duncan:SftpATTRS在我的Jasch JAR中不可用 –

回答

0

JSch已經提供了SftpProgressMonitor來監控上傳以及下載進度。它有三個功能,其中一個init會給你一個遠程文件大小。我準備了一個小程序,可以根據需要直接使用或定製。

IOUtil.java

public final class IOUtil { 

    private IOUtil() {} 

    public final DecimalFormat PERCENT_FORMAT = new DecimalFormat("#.##"); 
    private static final double KB = 1024.0d; 
    private static final double MB = KB * 1024.0d; 

    public static String getFileSize(final long fileSize) { 

    if (fileSize < KB) { 

     return fileSize + " bytes"; 

    } else if (fileSize < MB) { 

     return DECIMAL_FORMAT.format((fileSize/KB)) + " KB"; 

    } else 
     return DECIMAL_FORMAT.format((fileSize/MB)) + " MB"; 
    } 

    public static String calculatePercent(double part, double whole) { 
    return PERCENT_FORMAT.format ((part/whole) * 100); 
    } 
} 

DownloadProgressMonitor.java

public class DownloadProgressMonitor implements SftpProgressMonitor { 

    private double bytesCopied = 0L; 
    private double fileSize = 0L; 
    private String src; 
    private String dest; 

    public DownloadProgressMonitor() { 

    IOUtil.PERCENT_FORMAT.setRoundingMode(RoundingMode.CEILING); 
    } 

    @Override 
    public void init(int operation, String src, String dest, long fileSize) { 

    this.fileSize = Double.parseDouble(fileSize + ""); 
    this.src = src; 
    this.dest = dest; 

    System.out.println("Downloading file: " + src + " (" + IOUtil.getFileSize(fileSize) + ")..."); 
    } 

    @Override 
    public boolean count(long bytesTransferred) { 

    bytesCopied += bytesTransferred; 

    // watch out this is only print not println 
    System.out.print(IOUtil.calculatePercent(bytesCopied, fileSize) + "%..."); 

    return bytesTransferred != 0; 
    } 

    @Override 
    public void end() { 

    System.out.println(src + " downloaded \n"); 
    } 
} 

在您的實現類,請使用如下

ChannelSftp sftp = null; // initiate this channel 

sftp.get(remoteFileName, 
       destDir, 
       new DownloadProgressMonitor(), 
       ChannelSftp.OVERWRITE); 

這將無覆蓋工作任何額外的代碼。

相關問題