首页 新闻 会员 周边

文件"c:\tz\temp.rar"正由另一进程使用,因此该进程无法访问该文件。

0
悬赏园豆:30 [已解决问题] 解决于 2014-03-13 10:51

 频繁操作下载文件,就会出现如题BUG。请问改如何解决,请高手赐教?谢谢!代码如下:


 protected void ResponseFile(string filepath)
        {
            FileInfo file = new FileInfo(filepath);//创建一个文件对象
            Response.Clear();//清除所有缓存区的内容
            Response.Charset = "GB2312";//定义输出字符集
            Response.ContentEncoding = Encoding.Default;//输出内容的编码为默认编码
            Response.AddHeader("Content-Disposition", "attachment;filename=" + file.Name);
            //添加头信息。为“文件下载/另存为”指定默认文件名称
            Response.AddHeader("Content-Length", file.Length.ToString());
            //添加头文件,指定文件的大小,让浏览器显示文件下载的速度 
            Response.WriteFile(file.FullName);// 把文件流发送到客户端
            Response.End();
        }
 protected void BtnDownload_Click(object sender, EventArgs e)
        {
             string rarpath = @"c:\tz\temp.rar";
             ResponseFile(rarpath);
        }

james-ye的主页 james-ye | 初学一级 | 园豆:91
提问于:2014-03-04 13:33
< >
分享
最佳答案
0

我测试了兄弟们给的代码,但是还是会存在以上错误。最后,我在IIS里新增了一个虚拟目录(及下载目录),错误提示有时还会存在,但是不影响下载(点2次下载即可)。不管使用我原先的代码还是轻风拂夏 兄弟提供的代码,都可以下载。

james-ye | 初学一级 |园豆:91 | 2014-03-13 10:49
其他回答(6)
0

试试在 Response.End() 前面加上 Response.Flush();

Yu | 园豆:12980 (专家六级) | 2014-03-04 13:35

问题依旧,,一频繁操作就出现问题。而且无规律的报以上错误。谢谢

支持(0) 反对(0) james-ye | 园豆:91 (初学一级) | 2014-03-04 14:18

@james-ye: 可不可以不要使用同一文件名c:\tz\temp.rar,给个随机的 , 用完删除

支持(0) 反对(0) Yu | 园豆:12980 (专家六级) | 2014-03-04 16:21

@Yu: 我测试过。代码如下:

String Now = DateTime.Now.ToString("yyyymmddhhmmss");

string filepath = @"c:\tz\temp" + Now + ".rar";

这样好像也存在问题。

支持(0) 反对(0) james-ye | 园豆:91 (初学一级) | 2014-03-04 16:37
0
        /// <summary>
        /// 用流的方式下载文件
        /// </summary>
        /// <param name="filepath_name">文件路径及文件名</param>
        public static void FileDownLoad(string filepath_name)
        {
            System.IO.Stream iStream = null;

            //以10K为单位缓存:
            byte[] buffer = new Byte[10000];

            int length;

            long dataToRead;

            // 制定文件路径.
            string filepath = filepath_name;

            //  得到文件名.
            string filename = System.IO.Path.GetFileName(filepath);

            try
            {
                // 打开文件.
                iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
                            System.IO.FileAccess.Read, System.IO.FileShare.Read);


                // 得到文件大小:
                dataToRead = iStream.Length;

                System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
                System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);

                while (dataToRead > 0)
                {
                    //保证客户端连接
                    if (System.Web.HttpContext.Current.Response.IsClientConnected)
                    {
                        length = iStream.Read(buffer, 0, 10000);

                        System.Web.HttpContext.Current.Response.OutputStream.Write(buffer, 0, length);

                        System.Web.HttpContext.Current.Response.Flush();

                        buffer = new Byte[10000];
                        dataToRead = dataToRead - length;
                    }
                    else
                    {
                        //结束循环
                        dataToRead = -1;
                    }
                }
            }
            catch (Exception ex)
            {
                // 出错.
                System.Web.HttpContext.Current.Response.Write("Error : " + ex.Message);
            }
            finally
            {
                if (iStream != null)
                {
                    //关闭文件
                    iStream.Close();
                }
            }
        }
View Code
收获园豆:30
水晶途途 | 园豆:1443 (小虾三级) | 2014-03-04 14:07

行,我用你的这个方式来测试测试。谢谢!

支持(0) 反对(0) james-ye | 园豆:91 (初学一级) | 2014-03-04 14:29

@james-ye: 行的话,记得回来给分哦。

支持(0) 反对(0) 水晶途途 | 园豆:1443 (小虾三级) | 2014-03-04 15:05

@轻风拂夏: 恩,我在测试环境中试了下,目前没有出现以上问题。我今天更新下使用环境,让他们跑几天看看,没问题收了。嘿嘿~~

支持(0) 反对(0) james-ye | 园豆:91 (初学一级) | 2014-03-04 16:18
0

是不是你这个C盘没有权限访问?

雾静 | 园豆:561 (小虾三级) | 2014-03-04 14:46
0

应该是流文件没有关闭的原因造成的,往往你自己以为关了

小熊QQ糖 | 园豆:152 (初学一级) | 2014-03-04 14:54
0

第一,文件没有关闭,第二,同时访问一个文件,而且是独占的,这种情况可以尝试使用回复中的FileDownLoad方法,不独占打开文件。

lucika.zh | 园豆:62 (初学一级) | 2014-03-04 16:34
0

FileShare.Read 关键是这个

丫的 | 园豆:1575 (小虾三级) | 2014-03-04 17:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册