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如果设置小的话会出现什么问题 展开
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如果设置小的话会出现什么问题 展开
2个回答
展开全部
一般来说,想要理解一个内置函数怎么执行.你只要把鼠标移到那个函数名上面,就会有提示.如果使用的是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开始读取.这个需要你自己调试.
我说的不一定是对的。学程序没有什么捷径.多动手是必须的。
祝你好运.
比如 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开始读取.这个需要你自己调试.
我说的不一定是对的。学程序没有什么捷径.多动手是必须的。
祝你好运.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询