程序中设计文件的创建于读写,但是有时会出现XX文件被占用无法读取的问题,这个问题出现的概念很小,在不同的机子上出现的概率也不同,而且毫无规律,似乎是随机出现的错误,请教一下可能是什么问题?
   我可不可以在读取文件的时候判断一下文件是否被占用,如果被占用就把该占用关闭?具体怎么实现呢?

解决方案 »

  1.   

    你可以将文件放在一个bool的函数里 用lock进行上锁
      

  2.   

    不能判断文件是否打开,但是可以用lock来实现:object obj = new object();
    lock(obj)
    {
        // 操作文件
    }
      

  3.   

    try
    {打开}
    catch(Exception   ex)
    {关闭}  
     如果是打开的话次打开肯定会有异常,
    用catch()捕捉到异常后关掉它
      

  4.   

    lz这个问题应该是FileStream没有正确释放吧, 如果GC还没有处理fs, 那么文件就依旧处于占用状态; GC回收了, 文件就处于可用状态; GC处理的时机又是未确定的, 所以会出现lz这样的概率事件.所以不应该使用共享打开文件之类的方法, 那样会让文件处于一个不同步不可知的状态.lz应该检查一下FileStream之类的东西是不是已经处理好了. FileStream.Close()和FileStream.Dispose(). 如果FS处于多线程状态, 你还要注意同步访问.
      

  5.   


    保证每次打开文件使用完后关闭在finally中关闭打开的文件
      

  6.   

            [DllImport("kernel32.dll")]
            public static extern IntPtr _lopen(string lpPathName, int iReadWrite);        [DllImport("kernel32.dll")]
            public static extern bool CloseHandle(IntPtr hObject);        public const int OF_READWRITE = 2;
            public const int OF_SHARE_DENY_NONE = 0x40;
            public readonly IntPtr HFILE_ERROR = new IntPtr(-1);
            private void button2_Click(object sender, EventArgs e)
            {
                //cls_DataBaseForAdoInfo dbinfo = new cls_DataBaseForAdoInfo();
                //string str = string.Format("exec spp_Service_Precursortest '{0}','{1}','{2}'", textBox1.Text.Trim(), textBox2.Text.Trim(), textBox5.Text.Trim());
                //string ret = dbinfo.ExecProc_Test(str);
                //textBox6.Text = textBox6.Text + ret.Trim();
                string vFileName = @"c:\a.ini";
                if (!File.Exists(vFileName))
                {
                    MessageBox.Show("文件都不存在,你就不要拿来耍了");
                    return;
                }
                IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE);
                if (vHandle == HFILE_ERROR)
                {
                    MessageBox.Show("文件被占用!");
                    return;
                }
                CloseHandle(vHandle);
                MessageBox.Show("没有被占用!");
            }