java ftp 正在下载的文件使用后缀.tmp标记,下载完成后使用ftp上的文件名

各位大神,我想实现这样一个功能:使用java语言从ftp上下载文件,正在下载中的文件使用.tmp后缀标记,下载完成后使用.log.gz,ftp上的文件就是.log.gz文件,请问怎么实现,最好有代码。使用字符串拼接,还有下载完成重命名都试过了,不起作用。

4个回答

感觉像是文件没关闭造成的,你尝试着在fos.flush();后加一个fos.close()看看

qq_37257738
TaroLee 回复tang_cheng: 问题解决了,配置ftpclient.setFileType(FTPClient.BINARY_FILE_TYPE);就OK了
一年多之前 回复
qq_37257738
TaroLee 回复tang_cheng: 您好,在所有的fos.flush后边都加上fos.close()之后文件类型可以转换过来了,但是转换后的文件是损坏的,您知道是什么原因吗?
一年多之前 回复
qq_37257738
TaroLee 确实是这种情况,刚才发现的,谢谢你
一年多之前 回复
tang_cheng
tang_cheng 所有的fos.flush后都要加
一年多之前 回复

这个文件类型没任何关系,应该是你代码问题,你把相关代码先贴一下吧。

qq_37257738
TaroLee 代码我放到下边了
一年多之前 回复

别管文件名,下载完成后重命名就行了

private boolean downFileOrDir(String ftpFileName, String localDir) {
boolean flag = true;
try {
File file = new File(ftpFileName);

            File temp = new File(localDir);

            if(!temp.exists()) {
                temp.mkdirs();
            }

            //判断是否是目录
            if(isDir(ftpFileName)) {
                String [] names = ftpClient.listNames();
                for(int i=0; i < names.length; i++) {
                    System.out.println(i+1+":"+names[i]+"++++++");
                    if(isDir(names[i])) {
                        downFileOrDir(ftpFileName+'/'+names[i], localDir + File.separator + names[i].replace("*.", ""));
                        ftpClient.changeToParentDirectory();
                    }else {
                        String filetmp = localDir + File.separator + names[i]+".tmp";
                        String filedone = localDir + File.separator + names[i];
                        File localfile = new File(filetmp);
                        File localfiledone = new File(filedone);
                        if(localfiledone.exists()) {
                            continue;
                        }else if(localfile.exists()){
                            localfile.delete();
                            fos = new FileOutputStream(localfile);
                            ftpClient.retrieveFile(names[i], fos);
                            fos.flush();
                        } else {
                            fos = new FileOutputStream(localfile);
                            ftpClient.retrieveFile(names[i], fos);
                            fos.flush();
                        }
                        boolean b = localfile.renameTo(new File(filedone));
                        System.out.println(b);
                    }
                }
            } else {
                String filetmp = localDir + File.separator + file.getName() +".tmp";
                String filedown = localDir + File.separator + file.getName();
                File localfile = new File(filetmp);
                File localfiledown = new File(filedown);
                if(localfiledown.exists()) {
                    return true;
                } else if(localfile.exists()){
                    logger.debug("开始删除文件");
                    localfile.delete();
                    logger.debug("文件已经删除");
                    fos = new FileOutputStream(localfile);
                    ftpClient.retrieveFile(ftpFileName, fos);
                    fos.flush();
                } else {
                    fos = new FileOutputStream(localfile);
                    ftpClient.retrieveFile(ftpFileName, fos);
                    fos.flush();
                }
                localfile.renameTo(localfiledown);
                ftpClient.changeToParentDirectory();
            }

            logger.info("下载成功!");
        } catch(SocketException e) {
            logger.error("连接失败!", e);
            flag = false;
            return flag;
        }catch (IOException e) {
            logger.error("下载失败!", e);
            flag = false;
            return flag;
    }
    return flag;
}
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!