FtpClient 复制文件功能问题

Cavalier520520 2013-02-22 11:10:16

最近在做FTP连接远程服务器,然后操作远程服务器的文件,主要就是在远程服务器上某一个文件A,复制到远程服务器上的另一个文件夹B当中。、
代码如下,但是会出现小文件能够复制,但是大文件不能够复制成功。

private static boolean copyDirectory(FTPClient ftpClient, String from, String to) {
boolean copyFalg = false;
FTPFile[] filelist;
try {
// 枚举当前from目录所有文件+子目录
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.enterLocalPassiveMode();
filelist = ftpClient.listFiles(from);
int length = filelist.length;
FTPFile ftpFile = null;
String category = null;
InputStream inputStream = null;
for (int i = 0; i < length; i++) {
ftpFile = filelist[i];
category = ftpFile.getName();
if (ftpFile.isFile()) {
// 如果是文件则复制文件
//long l = ftpFile.getSize();
//ftpClient.setRestartOffset(13000);
inputStream = ftpClient.retrieveFileStream(from + PATH_SLASH + category);
// 复制文件时掉用了retrieveFileStream方法
// 调用完之后必须调用completePendingCommand释放,否则FTP会断开连接
if (!ftpClient.completePendingCommand()) {
copyFalg = false;
return copyFalg;
}
// 如果读取的文件流不为空则复制文件
if (inputStream != null) {
copyFalg = ftpClient.storeFile(to + PATH_SLASH + category, inputStream);
// 关闭文件流
inputStream.close();
if (!copyFalg) {
return copyFalg;
}
}

} else if (ftpFile.isDirectory()) {
// 如果是目录则先创建该目录
copyFalg = ftpClient.makeDirectory(to + PATH_SLASH + category);
// 再进入子目录进行递归复制
copyDirectory(ftpClient, from + PATH_SLASH + category, to + PATH_SLASH + category);
}
}
} catch (IOException e) {
logger.error("FtpClientUtil.copyDirectory failed. caused by " + e.getMessage(), e);
copyFalg = false;
}
return copyFalg;

}
...全文
2220 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
daixian07 2014-12-18
  • 打赏
  • 举报
回复
我是通过6楼的方法解决的
Java18 2014-11-11
  • 打赏
  • 举报
回复
楼主 解决了这个问题了吗?求帮助
zwbsxwt 2014-08-22
  • 打赏
  • 举报
回复 1
楼主,我也遇到了一样的问题,我最终解决方案是这样,将文件读到内存中去操作..不多说上代码,16Mb文件copy成功. client.setBufferSize(1024); ByteArrayOutputStream fos=new ByteArrayOutputStream(); client.retrieveFile(path+name, fos); ByteArrayInputStream in=new ByteArrayInputStream(fos.toByteArray()); client.storeFile(path+newfilename, in); fos.close(); in.close();
lidongfu_2007 2014-07-11
  • 打赏
  • 举报
回复
你要先关闭流 inputStream.close();,然后再执行ftp.completePendingCommand,否则会出现问题
  • 打赏
  • 举报
回复
你这复制文件一下整体复制啊,用标准的文件传输方式。放在缓存里慢慢的读
Cavalier520520 2013-02-22
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
Java code?123456789101112131415161718192021222324252627 FileInputStream fis = null; FileOutputStream fos = null; byte[] buffer = new byte[100]; int temp = 0; ……
这段代码只是基本的本地文件复制。 我上面的代码是,通过FTP连接到FTP服务器进行远程文件的复制。 和你说的不相同。 inputStream = ftpClient.retrieveFileStream(from + PATH_SLASH + category); // 复制文件时掉用了retrieveFileStream方法 // 调用完之后必须调用completePendingCommand释放,否则FTP会断开连接 if (!ftpClient.completePendingCommand()) { copyFalg = false; return copyFalg; } // 如果读取的文件流不为空则复制文件 if (inputStream != null) { copyFalg = ftpClient.storeFile(to + PATH_SLASH + category, inputStream); // 关闭文件流 inputStream.close(); if (!copyFalg) { return copyFalg; } } 这段代码就是在读取远程的某个文件,然后复制到新的地方。我也做了修改, inputStream = ftp.retrieveFileStream(fromFilePath); ftp.setDataTimeout(10000000); if (!ftp.completePendingCommand()) { success = false; return success; } outputStream = ftp.storeFileStream(toFilePath); byte[] buf = new byte[1024 * 16]; int size = 0; while ((size = inputStream.read(buf)) != -1){ outputStream.write(buf, 0, size); } 但是还是出现 超过100KB的文件就复制不成功,小于100KB的文件就能偶复制成功。
  • 打赏
  • 举报
回复

  FileInputStream fis = null;
        FileOutputStream fos = null;
        byte[] buffer = new byte[100];
        int temp = 0;
        try{
            fis = new FileInputStream("a");
            fos = new FileOutputStream("b");
            while(true){
                temp = fis.read(buffer,0,buffer.length);
                if(temp == -1){
                    break;
                }
                fos.write(buffer,0,temp);
            }        
        }
        catch(Exception e){
            System.out.println(e);
        }
        finally{
            try{
                fis.close();
                fos.close();
            }
            catch(Exception e2){
                System.out.println(e2);
            }
        }

Cavalier520520 2013-02-22
  • 打赏
  • 举报
回复
引用 1 楼 fangmingshijie 的回复:
你这复制文件一下整体复制啊,用标准的文件传输方式。放在缓存里慢慢的读
我这段代码的问题是卡死在: if (!ftpClient.completePendingCommand()) { copyFalg = false; return copyFalg; } 用标准的文件传输方式,放在缓存里谩慢的读是什么意思?能否讲的更清楚一些?谢谢

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧