写文件被另一个进程占用问题
请问下面代码有什么问题吗?我每30秒执行一次该方法,提示被另一个进程占用
private void WriteRequestLog(Dictionary 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());
}
}
}
慕标琳琳
浏览 816回答 14
14回答
-
HUH函数
找到原因了,是因为开启了web园,造成多个工作进程同时写一个文件
-
MM们
没什么问题,你应该看看文件到底被谁占用了。
-
慕桂英3389331
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”
-
慕村225694
是不是你的文件的操作没有dispose
或者你干脆找到进程,kill
打开App,查看更多内容