1. 程式人生 > >如何判斷ftp上傳檔案完畢

如何判斷ftp上傳檔案完畢

問題描述: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;
	}
}