首页 新闻 会员 周边

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

0
悬赏园豆:50 [已解决问题] 解决于 2013-01-31 10:02

请问下面代码有什么问题吗?我每30秒执行一次该方法,提示被另一个进程占用

private void WriteRequestLog(Dictionary<longDateTime> 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());
                }
            }           
        }
BraveChen的主页 BraveChen | 初学一级 | 园豆:18
提问于:2013-01-17 15:18
< >
分享
最佳答案
0

找到原因了,是因为开启了web园,造成多个工作进程同时写一个文件

BraveChen | 初学一级 |园豆:18 | 2013-01-31 10:00
其他回答(7)
0

没什么问题,你应该看看文件到底被谁占用了。

收获园豆:10
Launcher | 园豆:45045 (高人七级) | 2013-01-17 15:22
0

lock (syncFileObj) 是否有问题,锁得住否

Qlin | 园豆:2403 (老鸟四级) | 2013-01-17 15:54

这个应该锁得住,因为该对象是一个单例类中的成员变量

支持(0) 反对(0) BraveChen | 园豆:18 (初学一级) | 2013-01-17 15:56

@Brave.Y: 

那就是 其它地方 使用到这个文件了,检查一下

支持(0) 反对(0) Qlin | 园豆:2403 (老鸟四级) | 2013-01-17 17:02
0

是不是文件被占用啊?可能是删除文件操作有些延迟,而你执行写入又过于频繁。
可以这样不,不删除文件每次打开存在的文件就使用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(); } }
收获园豆:10
滴答的雨 | 园豆:3660 (老鸟四级) | 2013-01-17 16:02
0

光这段代码感觉没有什么问题,如果你这个问题很容易复现的话,在出现异常的时候把程序暂停住,用一些外部工具查看这个文件是否被其它进程打开了,微软的ProcessExplorer,win7的任务管理器,unlocker等都有这个功能。

PS:如果用工具查看到打开该文件的是你自己的程序进程,则说明你自己在其它地方打开了这个文件,那就是你的代码逻辑有问题了。

天方 | 园豆:5407 (大侠五级) | 2013-01-17 16:27

有什么工具可以看到哪个进程占用了文件吗?

支持(0) 反对(0) BraveChen | 园豆:18 (初学一级) | 2013-01-17 17:10

@Brave.Y: 工具名称“who lock me”

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-01-17 17:19

@Brave.Y: 我回复里不是列举了吗? 微软的ProcessExplorer,win7的任务管理器,unlocker等,这类工具很多的。

支持(0) 反对(0) 天方 | 园豆:5407 (大侠五级) | 2013-01-17 20:51
0

是不是你的文件的操作没有dispose

或者你干脆找到进程,kill

收获园豆:10
chenping2008 | 园豆:9836 (大侠五级) | 2013-01-17 16:59

本地跑没有问题,放到服务器跑的时候,不知道被什么进程占用,因为没办法登陆到服务器,所以不知道怎么搞了。

支持(0) 反对(0) BraveChen | 园豆:18 (初学一级) | 2013-01-17 17:01
0
 FileStream fs = new FileStream(url, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs, System.Text.Encoding.Default);

这样的情况,不单要与只读方式打开txt文件,而且,需要共享锁。还必须要选择flieShare方式为ReadWrite。因为随时有其他程序对其进行写操作。

收获园豆:20
az235 | 园豆:8483 (大侠五级) | 2013-01-18 08:56
0
sw.Flush();
sw.Close();
geass.. | 园豆:1821 (小虾三级) | 2013-01-18 11:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册