|
|
C#中FileStream对象处理多进程对同一文件的访问 |
作者:洛羽叶 点击率:5890 发布时间:2012-09-28 |
FileStream对象提供了对操作系统中文件访问API的所有封装功能,如果在多进程中需要访问并写入同一文件内容并为了提高性能预先打开句柄的方式,需要做以下的调整:
1.文件访问权限设定
文件打开模式,选择添加方式:FileMode.Append
文件访问权限选择写权限:FileAccess.Write
文件共享方式:
FileShare.ReadWrite 不允许其它进程删除,对于唯一的主控方不允许其它人删除;
FileShare.Delete | FileShare.ReadWrite 辅助方允许其它进程删除。
FileStream fileStream = null;
fleStream = new FileStream(FileNamePattern, FileMode.Append, FileAccess.Write,FileShare.Delete | FileShare.ReadWrite);
2.频繁创建文件造成Position属性和Length属性不一致的问题
需要在写文件前调用FileStream.Seek(0, SeekOrigin.End),或者FileStream.Position=FileStream.Length;
/* 纠正文件位置,共享文件句柄方式的弊端 */
FileStream.Seek(0, SeekOrigin.End);
FileStream.Write(buf, 0, buf.Length);
3.以上访问在高并发每条10000次以上会有1/1000的文件丢失和错位
有两种方式写之前锁定文件FileStream.Lock(0,FileStream.Length),直到能够锁定为止,但还是有1/10000出错的概率。
采用Mutex进行写操作锁定,每次消耗1/50000秒时间。
Mutex FileLock = null;
FileLock = new Mutex(false, "c:\temp\log.txt".Lower().Replace("\", "_").Replace(":", "_").Replace("/", "_").Replace("..", "_"));
FileLock.WaitOne();
//写文件
FileLock.ReleaseMutex();
FileLock.Close();
4.文件被删除时的判断
FileStream以可删除方式共享时,文件被删除,FileStream对象并不知道,需要File.Exists来判断文件是否存在大概每次消耗1/50000秒时间。
5.正常每个线程以打开句柄方式写文件30000条/秒,经过并发和锁定后能达到10000条。
6.磁盘及文件缓冲处理
写文件后要调用Flush刷新缓冲区,FlushToDisk选项在.NET FRAMEWORK4.0里有些问题,不要使用。
|
|
|
|
|
|