1.文件内容为一行一行不断增加的字符串。
2.有两个进程,A进程定时给文件尾追加字符串,B进程定时读取文件头的字符串
3.B进程读取完以后删除该行字符串
4.设立该缓存文件的目的是B进程不能正常读取字符串时,字符串可以一直保留,等B进程正常运行以后继续读取。
5.该缓存文件会很大(1M--10G左右),不能全部读出,操作完以后重新写一遍,只能按位置读写原文件。
请问有什么好的实现方法?

解决方案 »

  1.   

    以下这段代码是一个内存缓存,对于数据较少时很有用。    public class accessInfo
        {
            private AccountAccessInfo Info;
            private IList<AccountAccessInfo> infoList;  //数据缓存
            
            public accessInfo()
            {
                Info = null;
                infoList = new List<AccountAccessInfo>();
            }        /// <summary>
            /// 缓存中的记录数量
            /// </summary>
            public int coun
            {
                get
                {
                    return infoList.Count;
                }
            }        /// <summary>
            /// 缓存中的记录
            /// </summary>
            public AccountAccessInfo accountAccessInfo
            {
                get {
                    return Info;
                }
            }        /// <summary>
            /// 读取数据
            /// </summary>
            /// <returns></returns>
            public bool read()
            {
                bool bo;
                lock (infoList)
                {
                    if (infoList.Count > 0)
                    {
                        Info = infoList[0];
                        infoList.RemoveAt(0);
                        bo = true;
                    }
                    else
                    {
                        Info = null;
                        bo = false;
                    }
                }
                return bo;
            }        /// <summary>
            /// 将数据写入缓存中
            /// </summary>
            /// <param name="info">数据的实体类</param>
            public void write(AccountAccessInfo info)
            {
                lock (infoList)
                {
                    infoList.Add(info);
                }
            }    }    /// <summary>
        /// 客户接入信息的实体类
        /// </summary>
        [Serializable]
        public class AccountAccessInfo
        {
            private string sBindingsAdd;
            private string sBindingsPort;
            /// <summary>
            /// 客户接入信息的实体类的构造函数
            /// </summary>
            /// <param name="BindingsAdd">绑定地址</param>
            /// <param name="BindingsPort">绑定端口</param>
            public AccountAccessInfo(string BindingsAdd, string BindingsPort)
            {
                sBindingsAdd = BindingsAdd;
                sBindingsPort = BindingsPort;
            }        /// <summary>
            ///
            /// 绑定地址
            /// </summary>
            public string bindingsAdd
            {
                get { return sBindingsAdd; }
            }
            /// <summary>
            /// 绑定端口
            /// </summary>
            public string bindingsPort
            {
                get { return sBindingsPort; }
            }
        }
    使用示例            accessInfo myacc = new accessInfo();
                AccountAccessInfo info = new AccountAccessInfo("abc", "bcd");
                myacc.write(info);
                myacc.write(info);
                myacc.write(info);
                while (myacc.read())
                    textBox1.Text += myacc.accountAccessInfo.bindingsAdd+"\r\n";
      

  2.   

    用 StreamReader 和 StreamWriter,都属于System.IO
      

  3.   

    只要注意好并发控制就好了,没什么特别的。当然你如果用数据库或者MSMQ,那就更简单了,并发、性能别人都考虑好了,用起来也更方便。
      

  4.   

    谢谢关注
    数据结构方式写错了,确实是先进先出。
    已经经过测试,数据库(MSSqlServer2005Express)方式速度慢,不能采用,MSMQ部署时有困难,且增加了系统故障点
    毕竟文件方式简单直观,我们现在的主要困难是,怎么在B进程读完缓存文件头某行字符串时把这行删掉?
    我们怎么告诉操作系统该缓存文件的文件头已经移到下一行,并且释放已读取过的空间?