请问下面代码有什么问题吗?我每30秒执行一次该方法,提示被另一个进程占用
private void WriteRequestLog(Dictionary<long, DateTime> loginLogDic) { StringBuilder logStrBuilder = new StringBuilder(); foreach (var d in loginLogDic) { logStrBuilder.Append(string.Format("{0};{1}", d.Key.ToString(), d.Value.ToString("yyyy-MM-dd HH:mm:ss.fff"))); logStrBuilder.Append("\r\n"); } lock (syncFileObj) { string reqLogFile = string.Format("{0}\\RequestLog_{1}.txt", RequestLogDirectory, MachineName); if (File.Exists(reqLogFile)) File.Delete(reqLogFile); using (StreamWriter sw = new StreamWriter(reqLogFile,false)) { sw.WriteLine(logStrBuilder.ToString()); } } }
找到原因了,是因为开启了web园,造成多个工作进程同时写一个文件
没什么问题,你应该看看文件到底被谁占用了。
lock (syncFileObj) 是否有问题,锁得住否
这个应该锁得住,因为该对象是一个单例类中的成员变量
@Brave.Y:
那就是 其它地方 使用到这个文件了,检查一下
是不是文件被占用啊?可能是删除文件操作有些延迟,而你执行写入又过于频繁。
可以这样不,不删除文件每次打开存在的文件就使用FileMode.Truncate清空。代码如下
String path=""; FileMode fileMode=FileMode.Truncate; if(!File.Exists(path)) fileMode=FileMode.Create; using (FileStream fs = new FileStream("path", fileMode, FileAccess.Write)) { using (StreamWriter sw = new StreamWriter(fs)) { sw.WriteLine("123");
sw.Flush(); } }
光这段代码感觉没有什么问题,如果你这个问题很容易复现的话,在出现异常的时候把程序暂停住,用一些外部工具查看这个文件是否被其它进程打开了,微软的ProcessExplorer,win7的任务管理器,unlocker等都有这个功能。
PS:如果用工具查看到打开该文件的是你自己的程序进程,则说明你自己在其它地方打开了这个文件,那就是你的代码逻辑有问题了。
有什么工具可以看到哪个进程占用了文件吗?
@Brave.Y: 工具名称“who lock me”
@Brave.Y: 我回复里不是列举了吗? 微软的ProcessExplorer,win7的任务管理器,unlocker等,这类工具很多的。
是不是你的文件的操作没有dispose
或者你干脆找到进程,kill
本地跑没有问题,放到服务器跑的时候,不知道被什么进程占用,因为没办法登陆到服务器,所以不知道怎么搞了。
FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);
这样的情况,不单要与只读方式打开txt文件,而且,需要共享锁。还必须要选择flieShare方式为ReadWrite。因为随时有其他程序对其进行写操作。
sw.Flush();
sw.Close();