C#从FTP下载文件无法返回文件长度

问题描述

我要从FTP服务器下载指定文件,比如A.zip大小100kb,等下载成功,这个文件名,大小等信息会被存入一个数据库,等下次下载的时候会去比较,如果两个文件大小一致,就不下了,现在出了一个问题,返回的contentLength始终为-1,但是东西还是有的,可以下载下来,FTP是我自己临时搭建的,系统为win7,网络为政务外网,但是我家里自己测试的时候,用的清华大学FTP,可以返回文件大小,不知道怎么回事,是FTP设置的问题吗?查了MSDN说如果服务器没有返回长度则是-1,怎么搞?privatevoidFileDownload(){FtpWebResponsem_FtpWebResponse=null;try{bLastDownloadFinish=false;for(inti=0;i<downloadList.Count;i++){bFlag=false;WriteLog("准备下载["+downloadList[i]+"]");WriteLog("开始连接FTP...");m_FtpWebRequest=(FtpWebRequest)FtpWebRequest.Create(sIp+sSourceDir+downloadList[i]);m_FtpWebRequest.Credentials=newNetworkCredential(sUser,sPwd);m_FtpWebRequest.Timeout=30000;m_FtpWebRequest.UseBinary=true;m_FtpWebRequest.Method=WebRequestMethods.Ftp.DownloadFile;try{m_FtpWebResponse=(FtpWebResponse)m_FtpWebRequest.GetResponse();}catch(Exceptionex){WriteLog("FTP文件大小查询失败,原因:"+ex.Message);continue;}WriteLog("FTP文件大小查询成功");StreamftpResponseStream=m_FtpWebResponse.GetResponseStream();//sr=newStreamReader(ftpResponseStream);longcontentLength=m_FtpWebResponse.ContentLength;//始终为-1if(!Directory.Exists(sTargetDir)){Directory.CreateDirectory(sTargetDir);}SQLiteDataReaderreader=m_DbSqlite.GetReader(string.Format("select*fromlogwhereFileName='{0}'",downloadList[i]));if(reader.HasRows){bFlag=true;if(reader.Read()){if(reader["Length"].ToString()!=contentLength.ToString()){WriteLog("与原始文件大小不一致,重新下载,大小["+contentLength.ToString()+"]");ReDownLoad(ftpResponseStream,downloadList[i]);}else{WriteLog("已下载过大小一致的此文件,放弃下载!");}}}else{WriteLog("无此文件,开始下载,大小["+contentLength.ToString()+"]");ReDownLoad(ftpResponseStream,downloadList[i]);}reader.Close();ftpResponseStream.Close();//m_FtpWebResponse.Close();//m_FtpWebResponse.Dispose();WriteLog("下载结束!");WriteLog("======================================================");}}catch(Exceptionex){WriteLog("下载线程发生错误:"+ex.Message);}finally{if(m_FtpWebResponse.StatusCode!=FtpStatusCode.ConnectionClosed){m_FtpWebResponse.Close();}bLastDownloadFinish=true;}}privatevoidReDownLoad(StreamftpResponseStream,stringfile){try{try{if(File.Exists(sTargetDir+file+".tmp")){File.Delete(sTargetDir+file+".tmp");}}catch{}m_BeginTime=FormatTime(DateTime.Now);longlength=0;using(FileStreamoutputStream=newFileStream(sTargetDir+file+".tmp",FileMode.Create)){intbufferSize=2048;byte[]buffer=newbyte[bufferSize];List<int>test=newList<int>();intc=0;while((c=ftpResponseStream.ReadByte())!=-1){outputStream.WriteByte(Convert.ToByte(c));}length=outputStream.Length;m_EndTime=FormatTime(DateTime.Now);outputStream.Close();}stringsql="";if(bFlag){sql=string.Format("updatelogsetLength='{0}',BeginTime='{1}',EndTime='{2}'whereFileName='{3}'",length.ToString(),m_BeginTime.ToString(),m_EndTime.ToString(),file);}else{sql=string.Format("insertintolog(FileName,Length,BeginTime,EndTime)values('{0}','{1}','{2}','{3}')",file,length.ToString(),m_BeginTime.ToString(),m_EndTime.ToString());}if(m_DbSqlite.ExcuteSql(sql)!=1){WriteLog("更新数据库信息失败");}WriteLog("下载后文件大小:["+length.ToString()+"]");if(File.Exists(sTargetDir+file)){File.Delete(sTargetDir+file);}File.Move(sTargetDir+file+".tmp",sTargetDir+file);}catch(Exceptionex){WriteLog("下载出错:"+ex.Message);}}

解决方案

解决方案二:
我也造福一下人民吧!outputStream=newFileStream(filePath+"\"+fileName,FileMode.Create);reqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(ftpPath+fileName));reqFTP.Method=WebRequestMethods.Ftp.GetFileSize;reqFTP.UseBinary=true;reqFTP.Credentials=newNetworkCredential(userId,pwd);reqFTP.UsePassive=false;response=(FtpWebResponse)reqFTP.GetResponse();longcl=response.ContentLength;
解决方案三:
///<summary>///获取ftp的文件的长度///</summary>///<paramname="userId"></param>///<paramname="pwd"></param>///<paramname="ftpPath"></param>///<paramname="fileName"></param>///<returns></returns>publiclonggetFileSize(stringuserId,stringpwd,stringftpPath,stringfileName){try{FtpWebRequestreqFTP=(FtpWebRequest)FtpWebRequest.Create(newUri(ftpPath+fileName));reqFTP.Method=WebRequestMethods.Ftp.GetFileSize;reqFTP.Credentials=newNetworkCredential(userId,pwd);FtpWebResponseresponse=(FtpWebResponse)reqFTP.GetResponse();longcl=response.ContentLength;response.Close();returncl;}catch(Exceptionex){return-1;}}这句话是关键reqFTP.Method=WebRequestMethods.Ftp.GetFileSize;

时间: 2024-12-10 18:14:51

C#从FTP下载文件无法返回文件长度的相关文章

ftp 下载无后缀名文件报错

问题描述 我做的ftp下载程序,在下载无后缀名文件时,抱出"远程服务器返回错误:(404)未找到."以下是我的下载程序代码privatevoidDownload(stringfilePath,stringfileName){FtpWebRequestreqFTP;try{FileStreamoutputStream=newFileStream(filePath+fileName,FileMode.Create);reqFTP=(FtpWebRequest)FtpWebRequest.C

php中删除文件夹以及文件夹中的文件程序代码

在学习本方法之前我们最rmdir();函数,这个函数就是根据指定的文件路劲,删除文件或者是文件夹,但是当删除的是文件夹,并且文件夹里面还有内容的时候,就会出现Directory not empty 的错误,这个怎么来解决呢,现在我们就通过编写一个函数来解决这个问题. 在本实例中使用到了php中比较重要的几个文件操作的函数, 1.opendir:如果该函数成功运行,将返回一组目录流(一组目录字符串),如果失败将返回错误[error].你可以在函数的最前面加上"@"来隐藏错误. 2.rea

VB.NET中使用FTP下载文件的两种方法

下载   .net没有专门处理FTP的类,我们可以通过调用系统自带的FTP.EXE 或者是调用win32 API中的wininet.dll来完成基本操作.希望以下的代码能为大家抛砖引玉. 方法一: 使用Ftp.exe ,通过process类来调用它. Imports System.Diagnostics ...   Public Sub GetFileByCallFtp()        '定义ProcessStartInfo,Process的启动信息.         Dim psi As N

json-图片上传返回JSON数据,前台弹出下载保存文件框, 文件里面是JSON数据,页面上没显示图片怎么解决

问题描述 图片上传返回JSON数据,前台弹出下载保存文件框, 文件里面是JSON数据,页面上没显示图片怎么解决 10C @RequestMapping(value = ""kinduploadfile"" method = RequestMethod.POST) public @ResponseBody JSONObject KindUploadFile(HttpServletRequest requestHttpServletResponse response)

jsp java-JSP和Java的Action结合下载文件以后返回jsp页面,能把页面上文件的下载量更新一下吗?

问题描述 JSP和Java的Action结合下载文件以后返回jsp页面,能把页面上文件的下载量更新一下吗? 这边是一个下载按钮,直接下载服务器上的一个pdf格式的文件,下载以后数据库里面的下载量会增加.但是页面上显示的下载量没有增加,有没有办法让后台在文件下载完成以后给前台返回一个信息,然后前台根据信息去刷新页面? 注释:用异步请求肯定是不行的,因为用Ajax异步请求的话,文件不能下载! 求高手指点!不好意思!刚注册的用户还没有搞明白我们这边的C币是怎么来的!希望高手不要介意! 解决方案 下载完

文件传输-使用edtftp.jar在做ftp下载小文件是可以的,下载大小为G的文件老是报错

问题描述 使用edtftp.jar在做ftp下载小文件是可以的,下载大小为G的文件老是报错 远程主机是台HP-UX的机器,使用edtftp.jar在做ftp下载小文件是可以的,下载大小为G的文件老是报错,但也有些上G的文件是下载成功的,不知是为什么?麻烦各位牛人不吝赐教!先在此感谢各位了!com.enterprisedt.net.ftp.ControlChannelIOException: Control channel unexpectedly closed ('' read so far)

FTP下载txt文件时,在iIE浏览器中不显示下载框

问题描述 FTP下载txt文件时,在iIE浏览器中不显示下载框 FTP下载txt文件时,在iIE浏览器中不显示下载框,也不报错.其他文件格式的都可以显示,唯独txt文件不行,在火狐上面下载txt文件时正常的,看了代码res.setHeader("Content-Disposition","attachement;filename="+ new String((fileName.replaceAll(" ","")).getBy

如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作

原文:如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作 Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常IDE,FTP软件中少见的,而且是很耗工作时间的一个操作.换句话说,在Webstorm/Phpstorm中操作ftp能找到原来版本控制的感觉.唯一的缺点是:上传,下载的打开链接要稍费时间,适合的场景

ftp文件下载-expect ftp 下载文件文件损坏,写法如下,

问题描述 expect ftp 下载文件文件损坏,写法如下, #!/bin/expect set timeout 30 set host 10.9.9.145 set login_name zzz set login_pwd zzz set localpath "/home/acc/songt/read" set remotepath "/home/acc/songt/write" spawn -noecho ftp -i $host expect { timeou