none
远程更新Office文件出现“文件正在被其他用户或程序使用”的错误。 RRS feed

  • 问题

  • 客户端通过调用静态方法将客户端的文件上传到服务器某个目录,方法如下:

            static public string SaveFile(string filename, string location)
            {
                string s;
                if (File.Exists(filename))
                {
                    try
                    {
                        FileStream f = File.OpenRead(filename);
                        int b1;
                        MemoryStream m = new MemoryStream();
                        while ((b1 = f.ReadByte()) != -1)
                        {
                            m.WriteByte(((byte)b1));
                        }
                        f.Close();
                        s = WebServiceLayer.BusinessService.SaveFile(m.ToArray(), filename.Remove(0, filename.LastIndexOf('.')), location);
                        m.Close();
                    }
                    catch
                    {
                        throw;
                    }
                }
                else
                {
                    s = "文件不存在。";
                }
                return s;
            }


    该方法中使用的WebService中的方法如下:

            /// <summary>
            /// 上传
            /// </summary>
            /// <param name="filebyte">文件字节</param>
            /// <param name="filefix">后缀名</param>
            /// <param name="location">相对路径</param>
            /// <returns></returns>
            [WebMethod]
            [SoapHeader("Credential")]
            public string SaveFile(byte[] filebyte,string filefix, string location)
            {
                SecurityHelper.ValidateUser(Credential.Ticket);
    
                if (!filefix.StartsWith(".")) filefix = "." + filefix;
                if (!location.StartsWith("\\")) location = "\\" + location;
                if(!location.EndsWith("\\")) location = location + "\\";
                string filename = location  + DateTime.Now.ToFileTime().ToString() + filefix;
    
                try
                {
                    MemoryStream m = new MemoryStream(filebyte);
                    string s = Server.MapPath(".") + location;
                    if (!Directory.Exists(s)) Directory.CreateDirectory(s);
                    s = Server.MapPath(".") + filename;
                    FileStream f = new FileStream(s, FileMode.Create);
                    m.WriteTo(f);
                    m.Close();
                    f.Close();
                    f = null;
                    m = null;
                    return filename;
                }
                catch (Exception ex)
                {
                    Common.WebServiceHelper.ThrowServiceFailureException(ex.Message);
                    return ex.Message;
                }
            }


    更新文件的过程为先删除后重新上传。在调试时,没有什么问题(Clint与WebService在同一机器上);用户使用时,偶尔会反应更新文件时无法删除原有文件,提示类似“文件正在被其他用户或程序使用”的错误(用户主要使用OFFICE文件)。目前的解决方法是到服务器上删除原文件使其可以更新。请问是否有更好的方法不出现这一现象?(我怀疑是SaveFile方法中没有f.close(),但是又奇怪为何只偶尔出现这种状况。另外,排除用户未关闭OFFICE文件就上传的情况)。

    2009年5月13日 7:56

答案

  • public string SaveFile(byte[] filebyte, string filefix, string location)
        {
            SecurityHelper.ValidateUser(Credential.Ticket);
    
            if (!filefix.StartsWith(".")) filefix = "." + filefix;
            if (!location.StartsWith("\\")) location = "\\" + location;
            if (!location.EndsWith("\\")) location = location + "\\";
            //string filename = location  + DateTime.Now.ToFileTime().ToString() + filefix;
            string filename = location + Guid.NewGuid().ToString() + filefix; // 改成 Guid 就不会再出错了
    
    
            try
            {
                MemoryStream m = new MemoryStream(filebyte);
                string s = Server.MapPath(".") + location;
                if (!Directory.Exists(s)) Directory.CreateDirectory(s);
                s = Server.MapPath(".") + filename;
                FileStream f = new FileStream(s, FileMode.Create);
                try
                {
                    m.WriteTo(f);
                }
                catch
                {
                    //
                }
                finally
                {
                    m.Close();
                    f.Close();
                }
                f = null;
                m = null;
                return filename;
            }
            catch (Exception ex)
            {
                Common.WebServiceHelper.ThrowServiceFailureException(ex.Message);
                return ex.Message;
            }
        }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 Jeuo 2009年5月13日 8:42
    2009年5月13日 8:20
    版主

全部回复

  • public string SaveFile(byte[] filebyte, string filefix, string location)
        {
            SecurityHelper.ValidateUser(Credential.Ticket);
    
            if (!filefix.StartsWith(".")) filefix = "." + filefix;
            if (!location.StartsWith("\\")) location = "\\" + location;
            if (!location.EndsWith("\\")) location = location + "\\";
            //string filename = location  + DateTime.Now.ToFileTime().ToString() + filefix;
            string filename = location + Guid.NewGuid().ToString() + filefix; // 改成 Guid 就不会再出错了
    
    
            try
            {
                MemoryStream m = new MemoryStream(filebyte);
                string s = Server.MapPath(".") + location;
                if (!Directory.Exists(s)) Directory.CreateDirectory(s);
                s = Server.MapPath(".") + filename;
                FileStream f = new FileStream(s, FileMode.Create);
                try
                {
                    m.WriteTo(f);
                }
                catch
                {
                    //
                }
                finally
                {
                    m.Close();
                    f.Close();
                }
                f = null;
                m = null;
                return filename;
            }
            catch (Exception ex)
            {
                Common.WebServiceHelper.ThrowServiceFailureException(ex.Message);
                return ex.Message;
            }
        }

    知识改变命运,奋斗成就人生!
    • 已标记为答案 Jeuo 2009年5月13日 8:42
    2009年5月13日 8:20
    版主
  • string filename = location + Guid.NewGuid().ToString() + filefix;

    这样filename的长度超过了数据库对该字段设计的长度(在其他地方用到),引起的修改将比较多。请问有没有其他解决方法?
    2009年5月13日 8:36
  • 你好,关于问题的原因我的想法和你差不多,上面的代码新加了 try catch 你可以加上试试观察两天试试.
    另外有个较笨的方法,如果发现被占用,那就使用一个新的文件名。

    知识改变命运,奋斗成就人生!
    2009年5月13日 8:40
    版主
  • 好的,非常感谢您的回复。
    2009年5月13日 8:42