写文件被另一个进程占用问题

请问下面代码有什么问题吗?我每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,查看更多内容
随时随地看视频慕课网APP