public static void WriteFile(string strPath, string message, string desc)
        {
            string strRealPath;
            string strflag;
            try
            {
               
                //a.文件不存在则创建
                if (!File.Exists(strRealPath))
                {
                    FileStream sr = File.Create(strRealPath);
                    sr.Close();
                }
                strflag = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");                if (!String.IsNullOrEmpty(desc))
                {
                    strflag += "[" + desc + "]";
                }
                strflag += " desc:" + message;                using (var fs = new FileStream(strRealPath, FileMode.Append))
                {
                    using (var w = new StreamWriter(fs, Encoding.Default))
                    {
                        w.BaseStream.Seek(0, SeekOrigin.End);
                        w.WriteLine(strflag);
                        w.Flush();
                        w.Close();                    }
                    //fs.Flush();
                    fs.Close();
                }
            }
            catch
            {
                return;
            }
        }
 比如有两个线程在调用这个写文件的方法:WriteFile(@"C:\ErrMessage.txt","123","kk"); 有时候在C盘,发现有两个文件都叫 ErrMessage.txt文件,可能是两个或者多个线程同时创建了该文件,请问大家有什么好的方法,比如Lock或者其他同步,请贴上测试过的代码,谢谢!

解决方案 »

  1.   

    使用静态方法,需要另外定义一个静态变量用作锁对象若是使用单例的话,就可以直接使用this然后直接lock就可以了呀
      

  2.   

    来接点分.
    顺便说说我对多线程的看法.
    编程上使用多线程的确在性能上有很大的提高.但在编程上却会增加很大的难度.首先你的解决线程间的同步问题.当然这个也不是每次都需要处理.我使用多线程一般是开一个线程完成一件完整的事情.尽量避免多线程间的互相操作.像你这样的写文件我一般放在一个线程中.只由这个一个线程来处理.其他地方需要些写文件都使用这个线程.当然在写的时候最好lock否则还是有可能出问题.同时多线程的时候程序不好调试.如果有一个线程出问题了,比如某一个线程在操作数据库什么的,另外的线程也在操作数据库.这样当某一个线程出现异常的时候容易将整个程序给弄挂掉.所以对于有些外部资源尽量少用多个线程来操作.这些都是我个人意见.
      

  3.   

    貌似lz是用来写日志的。一半就是实现个LogHelper类。里面做到线程安全即可。先申明一个object lockHelper=new object();
    在调用这个方法的时候,lock(lockHelper)。object lockHelper=new object();
    public static void WriteFile(string strPath, string message, string desc)
            {
                string strRealPath;
                string strflag;            lock(LockHelper){            try
                {
                   
                    //a.文件不存在则创建
                    if (!File.Exists(strRealPath))
                    {
                        FileStream sr = File.Create(strRealPath);
                        sr.Close();
                    }
                    strflag = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");                if (!String.IsNullOrEmpty(desc))
                    {
                        strflag += "[" + desc + "]";
                    }
                    strflag += " desc:" + message;                using (var fs = new FileStream(strRealPath, FileMode.Append))
                    {
                        using (var w = new StreamWriter(fs, Encoding.Default))
                        {
                            w.BaseStream.Seek(0, SeekOrigin.End);
                            w.WriteLine(strflag);
                            w.Flush();
                            w.Close();                    }
                        //fs.Flush();
                        fs.Close();
                    }
                }
                catch
                {
                    return;
                }
                }
            }
      

  4.   

    good good study,day day up
      

  5.   

    实际上,new StreamWriter语句本身就会创建文件的,     new StreamWriter(path, append, encoding)
     
    用不着先独立去Create,也用不着什么先去 new FileStream。
      

  6.   

    关于你说“两个文件都叫 ErrMessage.txt文件”我倒是没有看到过。如果无法打开,那么应该“sleep(1000); goto begin”重试十几次,比如15次以后才return。
      

  7.   

    jjjjjjjjjjjjjjjjjjjjjjj
    fffffffffffffffffffffff
      

  8.   


    你说的我同意,但是你说的也许是pc环境,其实很多方法也许换个环境根本实现不了你在pc能实现的效果,正如我说的两个文件,没有看到过,并不代表不会发生,我想这是个基本的常理。
      

  9.   

    正常调用文件api同一个目录下是不可能出现同名文件的,只有绕过文件操作的API直接调用磁盘io才能做到,C#的File类显然不可能造成这种情况。
      

  10.   

    加锁,同时只允许一个线程访问文件.
    另外不知道你所谓的两个ErrMessage.txt是怎么回事.按理不可能存在同名的文件.