C#实现ftp文件上传,他写了一个ftp类 给我的步骤是1 ftp 2读取文件 3创建文件夹(分文件上传) 4 异常捕捉

师傅个的任务,他说ftp类里面有两个坑,FileInfofi=newFileInfo(filePath);FileStreamfs=fi.OpenRead();坑在这,说... 师傅个的任务,他说ftp类里面有两个坑, FileInfo fi = new FileInfo(filePath);
FileStream fs = fi.OpenRead();坑在这,说什么没有释放掉什么的?
public class FTPFileHelper
{
public static void UpdateFile(string filePath)
{
FileInfo fi = new FileInfo(filePath);
FileStream fs = fi.OpenRead();
long length = fs.Length;
string uri = string.Format("ftp://{0}:{1}{2}", "116.62.191.191", "21", "/" + filePath.Split('\\').Last());
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
request.Credentials = new NetworkCredential("ftp_user", "Qaz123456");
request.Method = WebRequestMethods.Ftp.UploadFile;
request.UseBinary = true;
request.ContentLength = length;
request.Timeout = 10 * 1000;
try
{
Stream stream = request.GetRequestStream();
int BufferLength = 2048; //2K
byte[] b = new byte[BufferLength];
int i;
while ((i = fs.Read(b, 0, BufferLength)) > 0)
{
stream.Write(b, 0, i);
}
stream.Close();
stream.Dispose();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
if (request != null)
{
request.Abort();
request = null;
}
}
}
}
让我用定时器控件实现一分钟自动上传一次文件,我该在那上传
展开
 我来答
Tech_Monkeye5
2018-09-13 · TA获得超过984个赞
知道小有建树答主
回答量:330
采纳率:92%
帮助的人:80.1万
展开全部
程序很坑是真的。你挖了很多坑在这里边。但你师傅说的两个坑其实只有一个!这个涉及到非托资源的问题,需要我们进行手动释放!
Stream就是,你既然知道Stream在使用完毕后进行close,为什么FileStream就不能Close一下?要知道不管你是FileStream还是其他的任何Stream都是继承于Stream的,而Stream就是非托资源,所以在使用后必须进行Close或Dispose!
换句话来说,你没有将FileStream对象进行Close导致某个文件一直被占用!但FileInfo却是托管资源,他不需要Close,也没有Dispose!所以它不是坑!
Stream.Close()与Stream.Dispose()之间存在关联性,就是Stream.Close()本身就会调用Dispose()!所以你写Close()是一个安全关闭的办法,会调用Dispose()的,而直接调用Dispose()也会让系统回收资源。
而真正的大坑就这一个!还有object = null;在C/CPP中会启作用,但对于.net来说,没有任何作用的——GC回收并不因为你使用了null而加快回收!关于使用资源使用完毕后是,再赋值为null能不能加快回收的讨论一直都有——很多人都以为会加快回收速度,事实上属于臆猜——这个语句并不能触了GC回收,而无论是否写null对GC回收没有影响,原因是GC回收机制的限制,对于0代/1代/2代类加收的时间分别为1:10:100,除非显式调用GC.Collection(),否则这个回收机制并不会受到任何影响——这是十年前的争论了。所以对于你的request = null;与程序直接退出方法是没有任何区别的,写了是很多余的!除非了你的request = null;之后还有很长时间需要运行才会退出方法!GC回收可能有影响(也是猜的)。
还有一点你可能不知道:
FileStream中的ReadBytes方法,我们一般使用长度是是4096的倍数(现在硬盘都是4k对齐),不管你是2048还是多少都是一次读一族,所谓的4k对齐就是这个作用,如果你是2048,你每两次读取同一个簇!这个如果对付小文件无可厚非,而对付大文件时就明显了!
打开你的电脑——写一个记事本(只写一个字符),看一下文件属性(文件大小为1byte,而占用空间是4k),因为磁盘缓冲等原因,所以读取时应该是4k的倍数!还有无论是2048还是4096都说明你太小心眼了——直接409600(100K)!
百度网友40b16a4
2018-09-13 · 超过21用户采纳过TA的回答
知道答主
回答量:70
采纳率:75%
帮助的人:38.5万
展开全部
  1. 定义一个定时器,1分钟调用一次UpdateFile方法

  2. finally 里面关闭掉 stream  或者调用Open时包含在using中,用using是个好习惯

网页链接

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式