C#关于文件流的缓存问题

stringTempFolderPath=System.Configuration.ConfigurationManager.AppSettings["TempFolde... string TempFolderPath = System.Configuration.ConfigurationManager.AppSettings["TempFolderPath"].ToString();//本地保存目录
string FtpUserName = System.Configuration.ConfigurationManager.AppSettings["FtpUserName"].ToString();
string FtpPassWord = System.Configuration.ConfigurationManager.AppSettings["FtpPassWord"].ToString();
string LocalFileExistsOperation = System.Configuration.ConfigurationManager.AppSettings["LocalFileExistsOperation"].ToString();//是否允许写入

Uri uri = new Uri("202.156.37.21");
string FileName = Path.GetFullPath(TempFolderPath) + Path.DirectorySeparatorChar.ToString() + Path.GetFileName(uri.LocalPath);

//创建一个文件流
FileStream fs = null;
Stream responseStream = null;
try
{
//创建一个与FTP服务器联系的FtpWebRequest对象
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
//设置请求的方法是FTP文件下载
request.Method = WebRequestMethods.Ftp.DownloadFile;

//连接登录FTP服务器
request.Credentials = new NetworkCredential(FtpUserName, FtpPassWord);

//获取一个请求响应对象
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
//获取请求的响应流
responseStream = response.GetResponseStream();

//判断本地文件是否存在,如果存在,则打开和重写本地文件

if (File.Exists(FileName))

{
if (LocalFileExistsOperation == "write")

{
fs = File.Open(FileName, FileMode.Open, FileAccess.ReadWrite);

}
}

//判断本地文件是否存在,如果不存在,则创建本地文件
else

{
fs = File.Create(FileName);
}

if (fs != null)
{

int buffer_count = 65536;
byte[] buffer = new byte[buffer_count];
int size = 0;
while ((size = responseStream.Read(buffer, 0, buffer_count)) > 0)
{
fs.Write(buffer, 0, size);

}
fs.Flush();
fs.Close();
responseStream.Close();
}
}
finally
{
if (fs != null)
fs.Close();
if (responseStream != null)
responseStream.Close();
}
以上代码中
while ((size = responseStream.Read(buffer, 0, buffer_count)) > 0)
{
fs.Write(buffer, 0, size);

}
具体是怎么执行的,不理解,请高手解释,这里的buffer如果设置小的话会出现什么问题
展开
 我来答
jessini
2011-01-07
知道答主
回答量:13
采纳率:100%
帮助的人:12.3万
展开全部
一般来说,想要理解一个内置函数怎么执行.你只要把鼠标移到那个函数名上面,就会有提示.如果使用的是VS 2008以上的 IDE,那么双击函数名。同样能看到函数的说明.
比如 responseStream.Read(buffer, 0, buffer_count);你只要在Read那个位置用鼠标双击,你就可以从元数据中看到说明.
看这个函数的样子,大概是这样:Read(byte[] buffer,int startPosition,int count);
这样看,那就是Response从文件流的位置startPosition开始,读取count个字节,存放到buffer里面去.返回值 size 指明本次操作,总共读取了多少个字节填充到buffer中,如果读取的字节大于0,那么接着执行fs.Write(buffer,0,size);否则中断这个while循环.
fs.Write(...);方法,将刚才responseStream读取到buffer中的东西,写到fs文件流中去.同样的,从位置0开赛读取,总共读取size个字节.
按照你这个代码的思想来说,buffer的大小,只会影响 while循环的次数.buffer小,那就多循环几次.

但是你要注意,我怀疑你这段代码是错误的.如果responseStream所读取的文件(也就是responseStream.Length)如果大于你先前设置的65536的话,while循环将会变成死循环,最后抛出OutOfMemoryException(这个Exception的名称我不记得了)或者堆栈益出.这个代码你自己调试一下。我机子上没有装VS(我改Java了),不能帮你调试了.

======================================
为什么我怀疑这段代码是错误的呢。
可能需要这样修改一下:
int offset = 0;
while ((size = responseStream.Read(buffer, offeset, buffer_count)) > 0)
{
fs.Write(buffer, 0, size);
offset += size;
}

为什么要这么写呢?
假如这个responseStream读取的文件字节数,大于你设定的buffer(这里是65536),假如说这个文件的字节数是 75536这么大.
第一次循环,从文件流位置0(offset这个时候是0)开始读取,总共读取了65536个字节,放到buffer里面。
然后第2次循环,从文件流的65536(这个时候offset=65536)开始读取后面的字节.此次读取剩下的1万个字节.

但是如果按照你原来的代码,恐怕会反复从responseStream文件流的位置0开始读取.这个需要你自己调试.
我说的不一定是对的。学程序没有什么捷径.多动手是必须的。
祝你好运.
MrPerformance
2011-01-06 · TA获得超过376个赞
知道小有建树答主
回答量:439
采纳率:0%
帮助的人:315万
展开全部
自己测试一下,看看会发生什么问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式