| 到了昨天晚上,终于建好了二字母的索引,本来想学习新技术,把二字母索引读入Hashtable表,可是未曾想,书上和网上都没有介绍到如何直接通过Key来取Value,好像需要DictionaryEntry或者IDictionaryEnumerator来取值,真是郁闷。而且发现Hashtable中的顺序与输入顺序不一致,这样就不能通过后前相减来获取偏移量了。以前用过结构体或者数组都行,我想还是简单点用数组吧。把索引取到数组中之后,兴冲冲的拿到原来的程序中调试,结果竟然在XmlTextReader.Read()是中断了。于是留到今天来解决。 由于SmartDeviceApplication调试太慢,于是转到控制台下调试。仔细分析了一些输出结果,发现产生的XML片断没有啥错误。感觉MessageBox显示调试信息太麻烦,于是试着琢磨.net调试方法,结果发现自动变量窗口真是好用。我需要知道的结果全部在里面,于是一步步的执行,发现在读完第一单词的片断后就会中止。后来,我把出错信息输出到控制台,发现提示是存在多个root的意思。看来XmlTextReader是无法读我的片断,发现XmlTextReader有个关于流片断的构造函数,可惜俺不知如何写其余的两个参数。于是我就想到把XML的头和尾再加上。要实现这个想法,关键要对将要读到内存流的字节数组进行扩充。经仔细调试,终于成功。 if(bFindWord){ string fullFileName = Path.Combine(fullAppPath, "etoc.xml"); FileStream fsEtoc = new FileStream(fullFileName,FileMode.Open); byte[] myByte = new byte[xml_addr_offset+100+13]; fsEtoc.Read(myByte,0,100); fsEtoc.Seek(xml_addr_start,SeekOrigin.Begin); fsEtoc.Read(myByte,100,xml_addr_offset); fsEtoc.Seek(iXmlLength-13,SeekOrigin.Begin); fsEtoc.Read(myByte,100+xml_addr_offset,13); MemoryStream myMemoryStream = new MemoryStream(myByte); StreamReader myStreamReader = new StreamReader(myMemoryStream); XmlTextReader myXmlTextReader = new XmlTextReader(myStreamReader); result = SeekWord(myXmlTextReader, inWord); myMemoryStream.Close(); myStreamReader.Close(); myXmlTextReader.Close(); fsEtoc.Close(); } |