none
关于C# Process的问题 RRS feed

  • 问题

  • 我报了这样一个错误:System.IO.IOException: The process cannot access the file '\\XXXX\XXX\XXXXXXX\XXXX\XXX\2\XXX002.xml' because it is being used by another process.

     

    路径是没问题的。是不是出现假死的线程了?而且占用了这个文件,导致再次对这个文件做操作的时候就报错了呢?

    如果是有一个线程占用了这个文件,我该怎么杀掉它呢?

    没思路,大家帮给看看,谢谢

    2010年5月28日 2:08

全部回复

  • 这种访问资源的用单实例模式做会比较好吧
    2010年5月28日 2:47
  • 程序不是我做的,可现在出了这个问题。无法再对这个xml文件操作了,服务器还不能重起,我想确定下是不是线程占用了这个文件,看看在不重新启动服务器的情况下,怎么杀掉这个线程。
    2010年5月28日 2:52
  • 把你访问这个文件的代码贴出来看看

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年5月28日 3:12
    版主
  • 你好!

         原因是其他的进程正在使用这个文件,所以导致无法访问了!具体还是要从自己的程序入手,很可能是自己的程序的问题,你要检测是需要做大量工作的,十分困难啊!


    周雪峰
    2010年5月28日 3:18
    版主
  • 代码太多了,我说下流程吧。

    这个程序应该是没问题的,因为它是每个月跑一次,处理一个当月的xml文件,山个月的正常处理了,这个月的报错了。

    首先是load这个xml文件到XmlDocument对象

    然后作了一个节点的修改

    再save的时候报错了。

    报的错误就是上边说的,所以我认为是文件被用中,并没有释放。

     

    2010年5月28日 3:21
  • 这个程序是写成dll的,在我们自己的环境无法运行。

    客户执行的效果来看,只有这个月的XML作处理时才出错了,所以我推断不是程序的原因。

    因为每个月的xml存放的文件路径不同,所以我觉得是这个文件操作时导致线程占用后,错误,并假死,并没有释放

    所以再次操作成为了不可能。

    还有什么可能呢。

    谢谢两位版主,呵呵

    2010年5月28日 3:26
  • 我猜测是不是因为有人直接或者通过共享打开着那个文件

    不过如果是像你所说批量处理的程序,打开前先检查会比较好吧

    2010年5月28日 3:43
  • 还有一个情况。

    就是这个xml文件在操作前是有东西的

    save的时候报错后,xml文件的大小变0了。

    这个问题我很想不通,如果说文件被其他进程占用,那就不能写了,怎么会变成0?

     

    2010年5月28日 3:56
  • 检查你的文件访问代码,如果用了实现IDisposable的对象,在用完之后都要dispose的

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年5月28日 4:05
    版主
  •  public class FetchProcessBase : IDisposable

            ~FetchProcessBase()
            {
                this.Dispose(false);
            }

            public void Dispose()
            {
                this.Dispose(true);
                GC.SuppressFinalize(this);
            }

            protected virtual void Dispose(bool disposing)
            {
                if (disposing)
                {
                    if (this.facade != null)
                    {
                        this.facade.Dispose();
                    }
                }
            }

     

    第二个Dispose是在finally中的,它try的部分在load和save之间。

    也就是说当执行析构函数this.Dispose(false);的时候,并没有释放FetchProcessBase?

     

    2010年5月28日 4:57
  • "这个程序应该是没问题的,因为它是每个月跑一次,处理一个当月的xml文件,山个月的正常处理了,这个月的报错了。"

    可以下载个ProcessExplorer工具,查查是哪个进程占用了这个文件。它也具备杀的功能。不用重启服务器。

    下载地址:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

    2010年7月1日 10:18