如何判断ftp上传文件完毕

在FTP上传文件过程中,可能出现程序读取到未完全上传的数据。解决方案包括:1) 使用临时文件名上传,完成后重命名;2) 文件尾部添加标识,检查是否能成功追加内容来判断上传结束。方案2的Java实现中,注意到FTP客户端上传时无法追加内容到已上传文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:ftp上传文件的时候总是先创建了文件,然后再上传。如果此时程序读取文件可能就读取一部分不完成的数据。那么怎么解决才合理呢


方案1.上传文件的客户端先创建一个临时文件名称,然后上传完毕再重命名。而重命名是修改注册表所以不会产生过程中数据不一致的问题


方案2.在ftp客户端上传文件不由我们控制的时候,不能实施第一方案怎么办呢。打开文件在文件尾追加一个标识内容,关闭打开文件,然后在重新打开文件判断追加写入的内容时候成功,如果不成功,说明文件还在被占用,如果成功了就说明ftp上传结束了。这里感谢公司同事小苏为此方案做出的贡献。

这里解释一下,经过多次实验得知ftp客户端上传文件的时候,使用程序在此文件上追加不上内容,而且java代码不报错,所以才有了方案2.


java代码如下:

package com.ehl.tvc.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.apache.commons.io.IOUtils;

public class FileUtil {
	private static String endTag = "end";
	/**
	 * 判断文件是否写入内容完毕,如果完毕返回true,反之false
	 * @param f
	 * @return
	 */
	public static boolean checkIniTransfered(File f){
		OutputStream output = null;
		try {
			output = new FileOutputStream(f, true);
			output.write((endTag+"\n").getBytes());
			output.flush();
			output.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			IOUtils.closeQuietly(output);
		}
		InputStream input =null;
		try {
			input = new FileInputStream(f);
			List<String> list =  IOUtils.readLines(input);
			if(list.size()>0){
				String endstr =list.get(list.size()-1);
				if(endTag.equals(endstr)){
					return true;
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			IOUtils.closeQuietly(input);
		}
		return false;
	}
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值