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;
}
}
}
}
让我用定时器控件实现一分钟自动上传一次文件,我该在那上传 展开
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;
}
}
}
}
让我用定时器控件实现一分钟自动上传一次文件,我该在那上传 展开
展开全部
程序很坑是真的。你挖了很多坑在这里边。但你师傅说的两个坑其实只有一个!这个涉及到非托资源的问题,需要我们进行手动释放!
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)!
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)!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询