java中如何判断java 上传ftp服务器器上的某个目录是否存在

java如何获得ftp服务器上指定文件的大小 - ITeye问答
我想获得ftp服务器上指定文件的大小
以及下载过程中文件的已完成下载的大小
求教
这个是我写的方法
public static boolean downLoadFtp(String ftpServerIp, String ftpUser,
String ftpPassWord, String url, String filePath, String fileName) {
FtpClient fc = new FtpClient(ftpServerIp);
fc.login(ftpUser, ftpPassWord);
fc.binary();
int filesize = 0;
String fileStr = filePath + fileN
File filename = new File(fileStr);
System.out.println("C::&&&& download&& 89&&& filename size&& ::& "+filename.toString());
if (filename.exists()) {//如果存在就直接覆盖
filename.createNewFile();
if (!filename.exists()) {
if (filename.createNewFile()) {
System.out.println("File&& is&& created&& successfully!");
RandomAccessFile getFile = new RandomAccessFile(fileStr, "rw");
getFile.seek(0);
// url="/FTPTest1.txt";
TelnetInputStream fget = fc.get(fileName);
DataInputStream puts = new DataInputStream(fget);
while ((ch = puts.read()) &= 0) {
filesize = filesize +
getFile.write(ch);
System.out.println("C::&& download&& 96&&& filesize& :&& :&& "
+ filesize);
fget.close();
getFile.close();
fc.closeServer();
} catch (IOException ex) {
ex.printStackTrace();
我应该如何在下载之前获得文件的大小啊
以及在现在过程中下载文件的大小···
谢谢··
我想做一个进度条····
可是没有办法获得文件的大小····
谢谢····
采纳的答案
进度条的实现,其实说起来很简单。就是在程序中开启两个线程,第一个线程用于动态的改变界面上进度条的value值,而第二个线程则在上传或是下载的过程中,做成一个循环,在此循环中,每次读取一定数量如8192字节数的数据。然后传完此数据后,调用第一个线程中的 updateProgress方法,来更新界面进度条的value值。
相信这篇文章可以解答你的问题。这篇文章详细介绍了java ftp 的实现。
已解决问题
未解决问题8494人阅读
linux unix 应用(71)
[ 本文作者:&]
俺自己写的一个ftp shell,用了很多技巧哦awk,sed等等,
#判断文件是否存在
isFileExisted()
&& NEED_CHECK_FILE_DIR=$1
&& NEED_CHECK_FILE=$2
&& FILE_COUNT=`find ${NEED_CHECK_FILE_DIR} -name &${NEED_CHECK_FILE}& | wc -l`
&& if [ ${FILE_COUNT} -eq &1& ]
&&&&& return 0
&&&&& return 1;
#判断是否还要下载文件
isNeedDownloadFile()
&& checkfile_dir=$1
&& ftp_over_checkfile=$2
&& cd ${checkfile_dir}
&& #如果标识所有数据下载完成的文件已经生成,那么就无需再次下载
&& #反之就需要下载
&& if isFileExisted ${checkfile_dir} ${ftp_over_checkfile}
&&&&&&&& echo &标识当日所有数据下载成功的文件 ${ftp_over_checkfile} 已经生成&;
&&&&&&&& return 1;&
&&&&&&&& echo &标识当日所有数据下载成功的文件 ${ftp_over_checkfile} 还没有生成&;
&&&&&&&& return 0;
&& fi&&&&&
#构建新的校验文件,因为校验文件本身的格式是
#因为远程机上的校验文件格式是
# 536 dvc_06_000002.dat
# 884 dvc_59_000001.dat
dvc_59_000002.dat
# end date
# 而我们只关心实际的文件名,所以在这里我们构建一个只有文件名的文件
# 即这种格式
# dvc_05_000006.dat
# dvc_05_000007.dat
# dvc_05_000008.dat
# dvc_05_000009.dat
# dvc_05_000010.dat
# 这种格式的好处就是方便了比较,因为我们的装载校验文件格式也是如此
buildNewCheckFile()&
&& checkfile_dir=$1
&& remote_ftp_checkfile=$2
&& new_ftp_checkfile=$3
&& #因为这时还不能表明ftp下载全部数据送达,只能表示服务器端的当然的数据已经全部准备好
&& #所以此时名称加一个.tmp后缀,一旦下载真正成功,就去掉.tmp后缀,形成真正的ftp_over_checkfile
&& ftp_over_checkfile_tmp=$4.tmp&
&& data_time=$5
&#& echo &${checkfile_dir}&
&#& echo &${remote_ftp_checkfile}&
#&& echo &${new_ftp_checkfile}&
#& echo &${ftp_over_checkfile}&
#& echo &${data_time}&
&& #最后一行的格式
&&& expect_string=&end date ${data_time}&
&&& lastrow_content=&&;
&& cd ${checkfile_dir}
&& #读取最后一行的内容
&& lastrow_content=`sed -n '$p' ${remote_ftp_checkfile}`
&& #如果最后一行于我们期待的结束标志一致
&& #就去除最后一行,从整个文件中取第4个字段打印到新的校验文件中,同时生成一个FTP下载完成的校验文件
&& #如果不一致,从整个文件中取第4个字段打印到新的校验文件中
&&&&& echo &${expect_string}&&
&&&&& echo &${lastrow_content}&&
&& if [ &${lastrow_content}& = &${expect_string}& ]&
&&&&&& echo &结束标记${expect_string}出现,表明远端机上当日数据准备完毕&
&&&&&& sed '$d' ${remote_ftp_checkfile}| awk '{print$4}' & ${new_ftp_checkfile};
&&&&&& touch& ${ftp_over_checkfile_tmp};
&&&&&& echo &生成ftp下载完成的临时文件${ftp_over_checkfile_tmp}&
&&&&&&& echo &结束标记${expect_string}还没有出现,表明远端机上当日数据还没有准备完毕&
&&&&&&& sed -n '1,$p' ${remote_ftp_checkfile} | awk '{print$4}'& & ${new_ftp_checkfile}
#比较校验文件,来判断还有哪些文件需要下载
compareCheckFile()
&&& checkfile_dir=$1
&&& new_ftp_checkfile=$2
&&& success_ftp_checkfile=$3
&&& need_download_file=$4
&&& data_time=$5
&&& EXPECT_STRING=&end date ${data_time}&
&&& LAST_ROW_CONTENT=&&;
&&& #判断FTP校验文件是否存在,如果存在,证明至少下载过一次
&&& #如果存在就与当前最新FTP校验文件比较,生成最新的记录有 需要下载的文件名列表的文件
&&& #如果不存在,证明还没有下载过,直接拷贝最新FTP校验文件 生成 需要下载的文件名列表的文件
&& if isFileExisted ${checkfile_dir} ${success_ftp_checkfile}
&&&&&&& #将最新需要下载的文件名放在need_download_file中
&&&&&& diff -c ${new_ftp_checkfile} ${success_ftp_checkfile} | sed -n '/^[-]/'p | sed '/^---/d' |sed 's/-[ ]//g' & ${need_download_file}
&&&&&& cp ${new_ftp_checkfile} ${need_download_file}
#下载check文件
downloadCheckFile()&
&& checkfile_dir=$1& #下载到哪个目录
&& need_download_file=$2
&& remote_host=$3
&& remote_dir=$4
&& username=$5
&& userpwd=$6
&& cd ${checkfile_dir};
&& (echo &user ${username} ${userpwd}&
&&& echo &cd&& ${remote_dir}&&&&&&&&&
&&& echo &get& ${need_download_file}&
&&& echo &by&)|ftp -v -i -n ${remote_host} & /dev/null
&&& echo &下载校验文件文件成功&
#下载数据文件
downloadDataFile()&
&& checkfile_dir=$1
&& remote_ftp_checkfile=$2
&& need_download_file=${checkfile_dir}/${remote_ftp_checkfile}.diff
&& new_ftp_checkfile=${checkfile_dir}/${remote_ftp_checkfile}.new
&& success_ftp_checkfile=${checkfile_dir}/${remote_ftp_checkfile}.success
&& move_file=${checkfile_dir}/${remote_ftp_checkfile}.move
&&& ftp_over_checkfile=${remote_ftp_checkfile}.over
&&& ftp_over_checkfile_tmp=${ftp_over_checkfile}.tmp&
&& #下载到哪个目录
&& download_dir=$3
&& #转换目录,即转换所抽取的文件都在这个目录,这里面的文件肯定都是正确,即大小肯定正确
&& transform_dir=$4
&& remote_host=$5
&& remote_dir=$6&
&& username=$7
&& userpwd=$8&
&& cd ${download_dir};
&&& echo &远程目录是&${remote_dir};
&& echo &本地下载目录是&${download_dir};
&#查看还有那些文件需要下载,然后依次下载&
&& for file_name in `awk '{print $1}' ${need_download_file}`
&&& (echo &user ${username} ${userpwd}&
&&&& echo &cd ${remote_dir}&&
&&&& echo &get ${file_name}&
&&&& echo &by&)|ftp -v -i -n&&& ${remote_host}&&& & /dev/null
&&&& #下载一个文件成功,就往成功文件列表中增加一条纪录
&&&& echo &下载文件 ${file_name} 到临时目录 ${download_dir} 成功。&
&&&& echo &${file_name}& && ${success_ftp_checkfile}
&&&& mv& ${file_name} ${transform_dir}
&&&& echo &${file_name}& && ${move_file}
&&&& echo &从临时目录 ${download_dir} 移动文件 ${file_name} 到转换数据目录 ${transform_dir} 成功。&
&& cd ${checkfile_dir}
&& #ftp_over_checkfile_tmp这个临时已经存在,表明服务器上当日数据已经全部准备完毕&
&& #然后在比较new_ftp_checkfile和success_ftp_checkfile,如果两个文件的行数一致,证明
&& #那么下载完这批数据,所有数据实际已经全部下载,那么把临时文件名改为正确的文件名
&&& echo ${checkfile_dir}&
&&& echo ${ftp_over_checkfile_tmp}&
&&& if& isFileExisted& ${checkfile_dir}& ${ftp_over_checkfile_tmp}&
&&&& new_ftp_filecount=`cat ${new_ftp_checkfile} | wc -l`
&&&& success_ftp_filecount=`cat ${success_ftp_checkfile} | wc -l`&
&&&& echo& &${new_ftp_filecount}&&&
&&&& echo& &${success_ftp_filecount}&&&
&&&& if [ &${new_ftp_filecount}& -eq &${success_ftp_filecount}& ]
&&&&& mv ${ftp_over_checkfile_tmp} ${ftp_over_checkfile};&
&&&&& echo &ftp_over_checkfile文件生成,表明当日数据全部下载成功。&
&&&&& echo &ftp_over_checkfile文件没有生成,表明当日数据还没有全部下载成功。&&
#Move所有文件是否成功
isMoveAllFilesSuccess()
&&& move_file=$1
&&& success_ftp_checkfile=$2
&&& checkfile_dir=$3
&&& cd ${checkfile_dir}
&&&& move_filecout=`cat ${move_file} | wc -l`
&&&& success_ftp_filecount=`cat ${success_ftp_checkfile} | wc -l`&&&
&&&& if [ &${move_filecout}& -eq &${success_ftp_filecount}& ]
&&&&& return 0;
&&&&&& return 1;&
#Move那些剩余文件,即没有成功的文件
#Move成功之后,那么积累成功移动文件列表的文件应当和已经成功下载的文件列表一致
#Move成功之后,并且生成一个Move.over文件,来表示当日文件全部移动成功
moveLeftFiles()&
&&& data_tmp_dir=$1
&&& data_dir=$2
&&& checkfile_dir=$3
&&& success_ftp_file=$4
&&& move_file=$5
&&& need_move_file=${move_file}.diff
&&& cd ${checkfile_dir}
&&& move_filecount=`cat ${move_file} | wc -l`
&&& success_ftp_filecount=`cat ${success_ftp_checkfile} | wc -l`&
&&&& echo& &${move_filecount}&&&
&&&& echo& &${success_ftp_filecount}&&&
&&&& #判断两个文件是否匹配,如果数目一致,证明所有文件移动完毕
&&&& #构建当前还需要移动,即没有被移动的文件列表
&&&& if [ &${move_filecount}& -eq &${success_ftp_filecount}& ]
&&&&&&& echo &所有文件已经移动完毕&
&&&&&&& #将最新需要移动的文件名放在need_download_file中
&&&&&& diff -c ${success_ftp_file} ${move_file} | sed -n '/^[-]/'p | sed '/^---/d' |sed 's/-[ ]//g' & ${need_move_file}
&&&&&& #开始移动剩余文件
&&& for file_name in `awk '{print $1}' ${need_move_file}`
&&&&& #根据文件列表依次移动文件
&&&&& mv ${data_tmp_dir}/${file_name}& ${data_dir}
&&&&& echo &${file_name}& && ${move_file}
&&&&& echo &从临时目录 ${data_tmp_dir} 移动文件 ${file_name} 到转换数据目录 ${transform_dir} 成功。&
&&& #生成移动终止文件
&&& cd ${checkfile_dir}
&&& cp ${success_ftp_checkfile}& ${move_file}
CONFIG_FILE=/essbase/etl/test/shell/bill.cfg
LOCAL_CHECKFIIE_DIR=`awk -F &=& '$1==&LOCAL_CHECKFIIE_DIR&& {print $2}' ${CONFIG_FILE}`
REMOTE_CHECKFIIE_DIR=`awk -F &=& '$1==&REMOTE_CHECKFIIE_DIR&& {print $2}' ${CONFIG_FILE}`
REMOTE_HOST=`awk -F &=& '$1==&REMOTE_HOST&& {print $2}' ${CONFIG_FILE}`
USER_NAME=`awk -F &=& '$1==&USER_NAME&& {print $2}' ${CONFIG_FILE}`
PASSWORD=`awk -F &=& '$1==&PASSWORD&& {print $2}' ${CONFIG_FILE}`
START_DATA_TIME=$1 #
REMOTE_FTP_CHECKFIIE=$2& #dvc.check
REMOTE_DATAFILE_DIR=$3
LOCAL_NEW_FTP_CHECKFILE=${REMOTE_FTP_CHECKFIIE}.new& #dvc.check.new
LOCAL_SUCCESS_FTP_CHECKFILE=${REMOTE_FTP_CHECKFIIE}.success& #
FTP_OVER_CHECK_FILE=${REMOTE_FTP_CHECKFIIE}.over #dvc.check.over
#记录Move成功文件列表的文件
MOVE_SUCCESS_CHECKFILE=${REMOTE_FTP_CHECKFIIE}.move
MOVE_OVER_CHECKFILE=${MOVE_SUCCESS_CHECKFILE}.over
WAIT_DOWNLOAD_FILE=${REMOTE_FTP_CHECKFIIE}.diff
#最初就下载到临时文件,等到文件下载完成后,才mv这个文件到转换所用到的数据目录
LOCAL_DATAFILE_TMP_DIR=$4 #/essbase/etl/test/tmp&
LOCAL_DATAFILE_DIR=$5& #/essbase/etl/test/data
cd ${LOCAL_CHECKFIIE_DIR}
echo &开始判断是否需要下载文件&
#如果对应数据时间的所有文件装载成功,会形成一个over文件来作为标识
#如果发现这个over文件,那么就不再下载对应数据时间的文件
#否则就一直下载文件
while& isNeedDownloadFile ${LOCAL_CHECKFIIE_DIR} ${FTP_OVER_CHECK_FILE}&
&& #开始下载远端的校验文件
& echo &Need download file&
& echo &开始下载远端校验文件&
& downloadCheckFile ${LOCAL_CHECKFIIE_DIR}& ${REMOTE_FTP_CHECKFIIE}&& ${REMOTE_HOST}&& ${REMOTE_CHECKFIIE_DIR}& ${USER_NAME}& ${PASSWORD}&&
& echo &结束下载远端校验文件&
& cd $LOCAL_CHECKFIIE_DIR
& echo &开始构建新的check文件&
& #构建新的check文件
& buildNewCheckFile ${LOCAL_CHECKFIIE_DIR}& ${REMOTE_FTP_CHECKFIIE}& ${LOCAL_NEW_FTP_CHECKFILE} ${FTP_OVER_CHECK_FILE}&& ${START_DATA_TIME}&
& echo &结束构建新的check文件&
& echo &开始比较check文件&
& #比较check文件,生成最新的需要下载的文件列表,当然这个文件列表也是存在一个文件里面&
& compareCheckFile ${LOCAL_CHECKFIIE_DIR} ${LOCAL_NEW_FTP_CHECKFILE}& ${LOCAL_SUCCESS_FTP_CHECKFILE} ${WAIT_DOWNLOAD_FILE} ${START_DATA_TIME}
& echo &结束比较check文件&
& echo &开始下载数据文件&
&& downloadDataFile ${LOCAL_CHECKFIIE_DIR} ${REMOTE_FTP_CHECKFIIE} ${LOCAL_DATAFILE_TMP_DIR} ${LOCAL_DATAFILE_DIR} ${REMOTE_HOST} ${REMOTE_DATAFILE_DIR} ${USER_NAME} ${PASSWORD}&
& echo &结束下载数据文件&
echo &结束判断是否需要下载文件&
echo &开始判断是否要移动剩余文件&
until isMoveAllFilesSuccess ${MOVE_SUCCESS_CHECKFILE}& ${LOCAL_SUCCESS_FTP_CHECKFILE}& ${LOCAL_CHECKFIIE_DIR}
&&& moveLeftFiles ${LOCAL_DATAFILE_TMP_DIR}& ${LOCAL_DATAFILE_DIR} ${LOCAL_CHECKFIIE_DIR} ${LOCAL_SUCCESS_FTP_CHECKFILE} ${MOVE_SUCCESS_CHECKFILE}&&&&
echo &结束判断是否要移动剩余文件&
touch ${MOVE_OVER_CHECKFILE}&
echo &Move全部文件的校验文件${MOVE_OVER_CHECKFILE}生成&
echo &${START_DATA_TIME}需要的转换数据全部准备完成&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:660128次
积分:6919
积分:6919
排名:第3270名
原创:50篇
转载:45篇
译文:45篇
评论:46条
(2)(13)(4)(1)(6)(4)(3)(1)(2)(2)(8)(3)(3)(3)(3)(7)(9)(11)(19)(8)(7)(16)(2)(29)(15)(2)(2)(4)(8)(5)(6)(5)(2)(5)(4)(3)(2)(16)(2)(2)(7)(2)(4)(1)(6)(1)(2)(2)(5)(1)(2)(5)(5)(1)(1)(1)(2)(1)(1)(1)(9)(6)(1)(2)(7)Java遍历FTP服务器上的文件
import java.io.IOE
import java.io.PrintW
import mons.net.PrintCommandL
import mons.net.ftp.FTPC
import mons.net.ftp.FTPF
import mons.net.ftp.FTPR
public class FTPListAllFiles {
public FTPC
public FTPListAllFiles(boolean isPrintCommmand){
ftp = new FTPClient();
if(isPrintCommmand){
ftp.addProtocolCommandListener(new PrintCommandListener(new
PrintWriter(System.out)));
public boolean login(String host,int port,String
username,String password) throws IOException{
this.ftp.connect(host,port);
if(FTPReply.isPositiveCompletion(this.ftp.getReplyCode()))
if(this.ftp.login(username,password))
this.ftp.setControlEncoding("GBK");
if(this.ftp.isConnected()){
this.ftp.disconnect();
//关闭连接
public void disConnection() throws IOException
if(this.ftp.isConnected())
this.ftp.disconnect();&
//通过路径获得路径下所有文件 输出文件名&
public void List(String pathName) throws IOException{
if(pathName.startsWith("/")&&pathName.endsWith("/")){
String directory = pathN
this.ftp.changeWorkingDirectory(directory);
FTPFile[] files = this.ftp.listFiles();
for(int i=0;i&files.i++){
System.out.println("得到文件:"+files[i].getName());
if(files[i].isFile()){
if(files[i].isDirectory()){
List(directory+files[i].getName()+"/");
public static void main(String[] args) throws IOException
FTPListAllFiles f = new FTPListAllFiles(true);
if(f.login("192.168.1.100",21, "zhuchao","zhuchao")){
f.List("/app/"); //地址,端口号,用户名,密码
f.disConnection();&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 java上传到ftp服务器 的文章

 

随机推荐