xxm0720
2018-01-09 07:55
采纳率: 40.9%
浏览 1.8k

C# 用UploadFile上传文件,保存到服务器中,但是在测试区正常,在正式去报错

    测试区的web.config没有配置requestLengthDiskThreshold,正式区好像也没有,但是在
    正式区上传附件报“Cannot access a closed file”,请问怎么解决?





    if (fupFile.PostedFile != null && fupFile.PostedFile.ContentLength > 0)
    {
        if (fupFile.HasFile)
        {

            ListItem item = new ListItem();
            item.Value = item.Text = fupFile.PostedFile.FileName;
            if (!lbxFile.Items.Contains(item))
            {
                lbxFile.Items.Add(item);
                files.Add(fupFile);
            }

        }
        if (files.Count > 0)
        {
            string WF_NO;
            string WF_Sale;
            string filename = "";
            string path = "d:\\Lorom\\ProductCenter\\WorkFlow\\FTPFile\\" + Session["wf_sale"].ToString() + "\\" + Session["WF_NO"].ToString() + "\\";
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            lblShow.Text = fupFile.PostedFile.FileName;

            WF_Sale = Session["UserNO"].ToString();
            WF_NO = Session["WF_NO"].ToString();


            WCFHelperBase wcfBase = new WCFHelperBase();
            foreach (FileUpload fup in files)
            {
                if (fup.HasFile)

                    filename = fup.FileName;
                //string extend = Path.GetExtension(filename);

                // fupFile.PostedFile.SaveAs(Server.MapPath(path)+"\\"+filename);
                // Directory.CreateDirectory(path);
                //myFile.SaveAs(path + fupFile);
                wcfBase.csHelper.GetUnsignFile(WF_NO, filename, WF_Sale);
                fup.SaveAs(path + "/" + fup.FileName);//无法访问已关闭的文件

            }
            //Page.ClientScript.RegisterClientScriptBlock(typeof(string), "", @"<script>alert('上传成功!')</script>");
            wcfBase.CloseWCF();
            Response.AddHeader("Refresh", "0");
        }
    }
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • FadeShadow 2018-01-09 08:34
    已采纳
     <System.Web>
       <httpRuntime executionTimeout="90" maxRequestLength="20000" useFullyQualifiedRedirectUrl="false" requestLengthDiskThreshold="8192"/>
    </System.Web>
    
    点赞 评论
  • mytst001 2018-01-09 08:40

    先刷新,再关闭,顺序别错。

    writer.Flush();
    fileStream.Flush();

    writer.Close();
    fileStream.Close();

    点赞 评论
  • andylww 2018-01-09 08:44

    判断下是不是 输出流没关闭。

    点赞 评论
  • fzply 2018-01-09 08:48

    很久没有写文件操作的方法了,记得之前写过一个类库是关于文件操作的,今天翻出来一看居然没有文件写入操作,于是临时加了一个(期间还询问了一下度娘,年纪大了,脑子不好使了)。

    写完后发现报一个错误:cannot access a closed file,神马情况?第一反应是文件关闭了,没有读取到,但是印象中filestream不用显式打开的啊,后来懒得想了,debug一下最快捷了

    于是,问题总算发现了,代码如下:

    ///
    /// 向文件中写入信息(文件不存在会创建文件)
    ///
    /// 文件内容
    /// 写入的字节数
    public static int WriteFile(string filePath,string fileContent)
    {
    FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate);
    StreamWriter writer = new StreamWriter(fileStream);

    writer.WriteLine(fileContent);
    writer.Flush();

            writer.Close();
            fileStream.Flush();
            fileStream.Close();
            return fileContent.Length;
        }
    

    关闭对象的顺序不对

    writer.close()执行后

    fileStream.Flush()再执行,这个时候文件应该关闭了,怎么可能写入呢?于是调整代码顺序,问题解决;

    ///
    /// 向文件中写入信息(文件不存在会创建文件)
    ///
    /// 文件内容
    /// 写入的字节数
    public static int WriteFile(string filePath,string fileContent)
    {
    FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate);
    StreamWriter writer = new StreamWriter(fileStream);
    writer.WriteLine(fileContent);
    writer.Flush();
    fileStream.Flush();
    writer.Close();
    fileStream.Close();
    return fileContent.Length;
    }

    点赞 评论

相关推荐 更多相似问题