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或者其他同步,请贴上测试过的代码,谢谢!
顺便说说我对多线程的看法.
编程上使用多线程的确在性能上有很大的提高.但在编程上却会增加很大的难度.首先你的解决线程间的同步问题.当然这个也不是每次都需要处理.我使用多线程一般是开一个线程完成一件完整的事情.尽量避免多线程间的互相操作.像你这样的写文件我一般放在一个线程中.只由这个一个线程来处理.其他地方需要些写文件都使用这个线程.当然在写的时候最好lock否则还是有可能出问题.同时多线程的时候程序不好调试.如果有一个线程出问题了,比如某一个线程在操作数据库什么的,另外的线程也在操作数据库.这样当某一个线程出现异常的时候容易将整个程序给弄挂掉.所以对于有些外部资源尽量少用多个线程来操作.这些都是我个人意见.
在调用这个方法的时候,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;
}
}
}
用不着先独立去Create,也用不着什么先去 new FileStream。
fffffffffffffffffffffff
你说的我同意,但是你说的也许是pc环境,其实很多方法也许换个环境根本实现不了你在pc能实现的效果,正如我说的两个文件,没有看到过,并不代表不会发生,我想这是个基本的常理。
另外不知道你所谓的两个ErrMessage.txt是怎么回事.按理不可能存在同名的文件.