有这么段下载文件的代码:// 输出硬盘文件,提供下载 
// 输入参数 _Request: Page.Request对象, _Response: Page.Response对象, _fileName: 下载文件名, _fullPath: 带文件名下载路径, _speed 每秒允许下载的字节数 
// 返回是否成功 
public static bool ResponseFile(HttpRequest _Request,HttpResponse _Response,string _fileName,string _fullPath, long _speed) 

try 

FileStream myFile = new FileStream(_fullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
BinaryReader br = new BinaryReader(myFile); 
try 

_Response.AddHeader("Accept-Ranges", "bytes"); 
_Response.Buffer = false; 
long fileLength = myFile.Length; 
long startBytes = 0;  int pack = 10240; //10K bytes 
//int sleep = 200; //每秒5次 即5*10K bytes每秒 
int sleep = (int)Math.Floor((double)(1000 * pack / _speed)) + 1; 
if (_Request.Headers["Range"] != null) 

_Response.StatusCode = 206; 
string[] range = _Request.Headers["Range"].Split(new char[] {'=', '-'}); 
startBytes = Convert.ToInt64(range[1]); 

_Response.AddHeader("Content-Length", (fileLength - startBytes).ToString()); 
if (startBytes != 0) 

_Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength)); 

_Response.AddHeader("Connection", "Keep-Alive"); 
_Response.ContentType = "application/octet-stream"; 
_Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(_fileName,System.Text.Encoding.UTF8) );  br.BaseStream.Seek(startBytes, SeekOrigin.Begin); 
int maxCount = (int) Math.Floor((double)((fileLength - startBytes) / pack)) + 1;  for (int i = 0; i < maxCount; i++) 

if (_Response.IsClientConnected) 

_Response.BinaryWrite(br.ReadBytes(pack)); 
System.Threading.Thread.Sleep(sleep); 

else 

i=maxCount; 



catch 

return false; 

finally 

br.Close(); 
myFile.Close(); 


catch(System.Exception e)

string s = e.ToString();
return false; 

return true; 

目前下载功能是能够实现,不过下载之后源文件就没有了。目前这个功能需要涉及到一部分直接保存在服务器硬盘上的文件,所以想请教各位怎么修改能够保留源文件?或者有什么不会删除源文件的下载方案可供参考的?小弟实在不想想把文件SaveAs到其他地方再下载,所以想问问各问。谢谢

解决方案 »

  1.   

    致1楼&2楼,源文件在下载完成之后确实是没了,这才是我莫名其妙的地方。不知道这种输出会不会是把源文件转成文件流之后“移动”出去了?因为下载可能会涉及到几百M的东西,所以原则上我不想先Copy到其他地方,那样会让别人觉得响应太慢
      

  2.   


    能否发一份完整的让小弟学习一下啊
    [email protected]
      

  3.   

    if (_Response.IsClientConnected) 
                    { 
                        _Response.BinaryWrite(br.ReadBytes(pack)); 
                        System.Threading.Thread.Sleep(sleep); 
                    } 这只是用文件流输出文件而已,没有涉及文件的下载和删除操作
      

  4.   

    小弟自己建了个工程去试这段代码,也没有发现文件被删除的情况。应该是原来的程序在哪里有处理,小弟再找找吧。多谢各位。另外致4楼MADfox1983,引用很简单,我也就不单独发邮件给你了。引用的方法这样就可以:ResponseFile(Page.Request, Page.Resonse, "我的文件.avi", Server.MapPath("../File/abc.avi"), 1024000) 
    其中_fileName参数是输出时的文件名称(包括后缀),_fullPath参数是文件保存的绝对路径